2013-12-14 25 views
5

我需要在类“ClassA”的一个实例,但它也实现接口“InterfaceI”的类中有一个变量。成员变量必须扩展类A并实现一些接口

显然,这可以为一个或另一个很容易做到:

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的都是外部libary的一部分,这libary有扩展ClassA和InterfaceI的类,我无法编辑它们以使它们扩展ClassB,因此此解决方案将无法工作。

+1

你不能,基本上是这样。您可以在设置变量时检查它,然后在需要时进行转换...但您无法在变量本身上表达该约束,而无需将该类设为通用类。 –

+0

在Java8中有一些魔法允许多重继承或某种混合... – Thufir

+0

@Jon Skeet设置变量时如何检查它? – jtedit

回答

1

我发现了一个相当不方便的解决方法。

类包含一个ClassA和InterfaceI参考如下:

private ClassA mItemClassA; 
private InterfaceI mItemInterfaceI; 

set方法则是这样的:

public void setVaraible(ClassA item){ 
    assert (item instanceof InterfaceI); 
    mItemClassA = item; 
    mItemInterfaceI = (InterfaceI) item; 
} 

的这个其他变化可以抛出异常,返回false等等,如果该项目不是InterfaceI的实例,则该类中的其他方法然后可以使用mItemClassA a调用来自InterfaceI和ClassA的函数nd mItemInterfaceI。

我现在不打算实现get方法,但是如果我这样做了,那么可能必须有一个版本来获取接口和一个版本才能获得该类。

+0

我会使用异常。默认情况下,断言不会被选中。这是一个额外的标志,你必须打开。 +1 btw。 –

0

您可以使用泛型类的类型,因为这做到这一点:

private class ClassB <R extends ClassA & InterfaceI> { 
    R mVaraible; 
} 
相关问题