Java 必须扩展类A并实现某些接口的成员变量

Java 必须扩展类A并实现某些接口的成员变量,java,extends,implements,Java,Extends,Implements,我需要在一个类中有一个变量,它是类“ClassA”的实例,但也实现了接口“InterfaceI” 显然,这可以很容易地做到: private ClassA mVariable; private InterfaceI mVaraible; 但是我如何在扩展ClassA和实现InterfaceB的同时实现对象呢?比如: private <? extends ClassA & InterfaceI> mVaraible; 但是InterfaceI和ClassA都是外部库的一部分

我需要在一个类中有一个变量,它是类“ClassA”的实例,但也实现了接口“InterfaceI”

显然,这可以很容易地做到:

private ClassA mVariable;
private InterfaceI mVaraible;
但是我如何在扩展ClassA和实现InterfaceB的同时实现对象呢?比如:

private <? extends ClassA & InterfaceI> mVaraible;

但是InterfaceI和ClassA都是外部库的一部分,这个库有扩展ClassA和InterfaceI的类,我不能编辑它们使它们扩展ClassB,因此这个解决方案不起作用。

我找到了一个相当棘手的解决方法

该类包含ClassA和InterfaceI引用,如下所示:

private ClassA mItemClassA;
private InterfaceI mItemInterfaceI;
然后,set方法如下所示:

public void setVaraible(ClassA item){
    assert (item instanceof InterfaceI);
    mItemClassA = item;
    mItemInterfaceI = (InterfaceI) item;
}
如果该项不是InterfaceI的实例,则此操作的其他变体可能会引发异常、返回false等

然后,类中的其他方法可以使用mItemClassA和MitemMinterFacei从InterfaceI和ClassA调用函数


我现在不打算实现get方法,但如果我实现了,则可能需要一个版本来获取接口和一个版本来获取类。

您可以对泛型类类型执行此操作,如下所示:

private class ClassB <R extends ClassA & InterfaceI> {
    R mVaraible;
}
私有类B{
R有可能;
}

基本上你不能。您可以在设置变量时检查它,然后在需要时强制转换。。。但是,如果不使类泛型,就无法在变量本身上表达该约束。Java8中有一些魔法允许多重继承,或者某种混合…@Jon Skeet设置变量时如何检查它?类是最终的吗?如果B扩展了A,为什么C不能扩展B?我猜B是final…或者其他。@jtedit:如果你从泛型方法设置它,你可以使用那里的类型系统。但是,除此之外,您可以只使用
if(x instanceof…
我将使用异常。默认情况下,不会检查断言。这是一个额外的标志,你必须打开+1顺便说一句。
private class ClassB <R extends ClassA & InterfaceI> {
    R mVaraible;
}