我需要在一个类中有一个变量,它是类“ClassA”的一个实例,但它也实现了接口(interface)“InterfaceI”。
显然这可以很容易地为一个或另一个完成:
private ClassA mVariable;
private InterfaceI mVaraible;
但是我如何强制对象既扩展了 ClassA 又实现了 InterfaceB?像这样的东西:
private <? extends ClassA & InterfaceI> mVaraible;
是我需要的,但我不知道语法,甚至不知道它是否可能。我还需要一个 get 和 set 方法,但这可以用泛型来完成(我想?)
显而易见的解决方案是
public class ClassB extends ClassA implements InterfaceI{
//whatever here
}
但是 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 和 mItemInterfaceI 从 InterfaceI 和 ClassA 调用函数。
我现在不打算实现 get 方法,但如果我这样做,可能必须有一个版本来获取接口(interface)和一个版本来获取类。
关于java - 必须扩展类 A 并实现一些接口(interface)的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20582721/