我需要在一个类中有一个变量,它是类“ClassA”的一个实例,但它也实现了接口“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,因此这个解决方案不起作用。
答案 0 :(得分:1)
我找到了一个相当狡猾的解决方法。
该类包含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方法,但是如果我这样做的话,可能必须有一个版本来获取接口和版本才能获得该类。
答案 1 :(得分:0)
您可以使用通用类类型执行此操作:
private class ClassB <R extends ClassA & InterfaceI> {
R mVaraible;
}