一般来说,是否可以限制可能实现接口的类?
更具体地说,通用接口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
个对象。
在用完所有其他信息来源后,我已经有了强烈的预感,这是不可能的 - 但如果有人能证明不是我会很高兴!
答案 0 :(得分:4)
如果不一定要强制转换,那么在界面中添加这样的其他方法就足够了:
public T getT()
如果大多数实现实际扩展T
,则只需return this
作为该方法的实现。
答案 1 :(得分: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> {}
另外,考虑一下Joachim的建议(为什么演员,只需使用T
)。这是仿制药的用途。
答案 2 :(得分:0)
限制谁可以实现界面的唯一方法是使用visiblity修饰符控制界面的可见性:public,protected,private或默认修饰符(包)。