Java – 定义扩展A类并实现接口B的成员

我有一个必须满足两个条件的变量,我想在定义中设置它们

我知道我可以使用单个变量定义任一条件,就像在任何这些示例中一样

private Class variable; //or private A variable; //or private Class variable; //or private B variable; 

但有没有办法让变量满足这两个条件?

我希望这样的事情

 private Class variable; 

但是当我需要调用它或存储它的多个副本时,我找不到任何方法可以在没有类型转换的情况下执行此操作

您可以声明具有多个边界的类型参数,例如:

 public static  void test(Class clazz) 

但是你不能声明一个有多个边界的变量:

 private Class variable; // doesn't work 

您可以创建一个扩展A并实现BabstractC ,这样只需要一个绑定。

 abstract class C extends A implements B {} 

然后:

 private Class variable; 

虽然Java不直接支持A&BA&B交集类型,但这些类型确实出现在类型参数边界和捕获转换中。 我们可以用一层抽象来表达A&B

 public class ValueAB { public final T v; // constructor ... } public class ClassAB { public final Class clazz; // constructor ... } 

而不是A&B, Class A&B, Class ,我们使用包装器ValueAB, ClassAB

  ClassAB clazz = new ClassAB<>(Foo.class); ValueAB value = new ValueAB<>(clazz.c.newInstance()); value.v.methodOfA(); value.v.methodOfB(); 

对于As和Bs的每种组合,该解决方案需要包装器。


另一种解决方案是仅使用A作为类型参数绑定; B将由通配符绑定提供。 如果您需要在使用地点表达多种A&B1, A&B2, ...类型,这可能会更好。

 public class ValueA { public final T v; ... } public class ClassA { public final Class c; ... } --- ClassA clazz = new ClassA<>(Foo.class); ValueA value = new ValueA<>(clazz.c.newInstance()); 

如果在这些情况下令人困惑的通配符如何工作,请参阅我在通配符上的文章


第三种解决方案在包装纸的申报地点没有A或B; 使用网站提供A和B.

 public class Value { public final T v; ... } public class Clazz { public final Class c; ... } --- Clazz clazz = new Clazz<>(Foo.class); Value value = new Value<>(clazz.c.newInstance()); 

然而,这可能太令人困惑了。