2012-09-05 57 views
3

我有两个接口。一个接口A和一个接口B,扩展了接口A.现在,我有一个喜欢保持对象的引用的类,它实现了A或B.我想为它提供setter。我在下面尝试,但得到类型错误匹配例外。Java界面 - 泛型

public interface A { 
} 

public interface B extends A { 
} 

public class AB { 
private Class<? extends A> object; 

public void setObject(Class<? extends A> o){ 
    this.object = o; 
} 
} 

所以基本上,我想setObject方法接受,要么实现接口A或B.

+1

只需将其输入为'A':setObject(A a)' –

+0

@Jordão设置该答案作为答案,并包含一个链接,说明为什么对我的+1有效(多态)。 – pickypg

+0

@pickypg:完成。 –

回答

4

答案很简单对象:

类型作为AsetObject(A a)

实现B一类也实现A。全码:

public class UsesA { 
    private A a; 

    public void setObject(A a){ 
    this.a = a; 
    } 
} 

现在,如果你真的想与B工作,您可以输入它作为B,这也将让你把它当作一个A,因为从中B继承:

public class UsesB { 
    private B b; // can call A's methods on this field 

    public void setObject(B b) { 
    this.b = b; 
    } 
} 

但现在你可以在A(静态)引用不传递给setObject。如果你真的想这样做,那么你需要首先将它作为B下载它,这可能会在运行时失败。泛型不会改进。

+1

[多态](http://en.wikipedia。org/wiki/Polymorphism_in_object-oriented_programming)是一件很棒的事情 – pickypg

+0

@pickypg:确实! –

+0

@Jordao:谢谢你的回答。但如果将来,接口B增加了新的方法。在这种情况下,我将不得不上演它,不是吗? –

2

如果你有实现B一个对象,它也将是A一个实例。正因为如此,你可以让setObject接受任何A,这将允许AB实例被传递给它。

public void setObject(A a){ 
    this.object = a; 
} 
0

如前所述,如果您将使用(A)它将工作,因为B是A类型。因此,子类可以始终表示它的父类。

2

您的代码实际上并不符合您的问题。你说,

我有类喜欢保持要么 实现A或B

但是场(称为object)对象的引用实际上是一类,而不是一个对象(一个类的实例)。

你的代码工作如果你真正想拥有你的二传手接受扩展A.任何接口,但正如你可能从其他答案现在意识到,你真正想要的:)

public class AB { 
    private Class<? extends A> type; // renamed from object for clarity 

    public void setObject(Class<? extends A> type) { 
     this.type = type; 
    } 

    @Test 
    public void testSetter() { 
     setObject(A.class); // no errors 
     setObject(B.class); // no errors 
    } 
} 
实例