繁体   English   中英

Java-定义扩展类A和实现接口B的成员

[英]Java - Defining a member that extends class A and implements interface B

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

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

private Class<? extends A> variable; //or
private A variable; //or
private Class<? extends B> variable; //or
private B variable;

但是有办法让变量同时满足两个条件吗?

我希望有这样的东西

private Class<? extends A implements B> variable;

但是当我需要调用它或存储它的多个副本时,如果没有类型转换,我找不到任何方法

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

public static <T extends A & B> void test(Class<T> clazz)

但是您不能声明具有多个边界的变量:

private Class<? extends A & B> variable;  // doesn't work

您可以创建一个abstractC ,该类扩展A并实现B ,因此只需要一个界限。

abstract class C extends A implements B {}

然后:

private Class<? extends C> variable;

尽管Java不直接支持A&BA&B交集类型,但此类类型的确会出现在类型参数范围内并捕获转换。 我们可以用抽象层来表达A&B

public class ValueAB<T extends A&B>
{
    public final T v;

    // constructor ...
}

public class ClassAB<T extends A&B>
{
    public final Class<T> 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和B的每种组合使用包装器。


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

public class ValueA<T extends A>
{
    public final T v;
    ...
}


public class ClassA<T extends A>
{
    public final Class<T> 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<T extends S, S>
{
    public final T v;
    ...
}


public class Clazz<T extends S, S>
{
    public final Class<T> c;
    ...
}

---

    Clazz<? extends A, B> clazz = new Clazz<>(Foo.class);

    Value<? extends A, B> value = new Value<>(clazz.c.newInstance());

但是,这可能太令人困惑了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM