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 extends A & B> variable; // doesn't work
您可以创建一个扩展A
并实现B
的abstract
类C
,这样只需要一个绑定。
abstract class C extends A implements B {}
然后:
private Class extends C> variable;
虽然Java不直接支持A&B
类A&B
交集类型,但这些类型确实出现在类型参数边界和捕获转换中。 我们可以用一层抽象来表达A&B
。
public class ValueAB { public final T v; // constructor ... } public class ClassAB { public final Class clazz; // constructor ... }
而不是A&B, Class extends A&B>
A&B, Class extends A&B>
,我们使用包装器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 extends B> clazz = new ClassA<>(Foo.class); ValueA extends B> 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 extends A, B> clazz = new Clazz<>(Foo.class); Value extends A, B> value = new Value<>(clazz.c.newInstance());
然而,这可能太令人困惑了。