2011-02-18 99 views
5

一般来说,是否可以限制可能实现接口的类?限制可能实现接口的类

更具体地,可以在通用接口Foo<T>限制其实现来的T后代:

interface Foo<T> {} 
class Baz extends Bar implements Foo<Bar> {} // desirable 
class Baz extends Bar implements Foo<Qux> {} // undesirable 

上下文是Foo<Bar>对象应该被强制转换为Bar对象类型安全方式。

已经耗尽了所有其他信息来源,我已经有了一个强烈的预感,这是不可能的—但如果有人能证明,我会很高兴!

+2

是否需要投射? 'T getT()`方法是否足够?一个实现可以将它实现为`return this;`如果它碰巧是正确的类型。 – 2011-02-18 11:44:03

+0

@Joachim:现在我只是觉得很傻! :)这会做得很好 - 谢谢你。如果您发布答案,我可以对其进行适当标记/评分? – eggyal 2011-02-18 12:02:15

回答

4

如果投的能力并非绝对必要,再加入这样对你的接口一个额外的方法就足够:

public T getT() 

如果大多数的实现实际上延长T,他们可以简单地return this为对本实施方法。

0

限制谁可以实现你的接口的唯一方法是通过使用visiblity修饰符来控制接口的可见性:public,protected,private或默认值(包)。

3

以下显示了第7行的编译错误,所以我认为这是你想要的,对吧?

1 public interface Foo<T extends Bar> {} 
2 
3 public class Bar{} 
4 public class Qux{} 
5 
6 class Baz extends Bar implements Foo<Bar> {} 
7 class Baz2 extends Bar implements Foo<Qux> {} 

另外,还要考虑约阿希姆的意见(为什么投,只需使用T)。它是如何使用泛型的。