Java泛型类型
当我有一个接口Java泛型类型,java,generics,Java,Generics,当我有一个接口 public interface Foo<T> { T someMethod(); } 公共接口Foo{ T somethod(); } 有没有办法确保当某个类实现这个接口时,泛型类型是同一个implementig类 例如: public class Bar implements Foo<Bar> { Bar someMethod() { return new Bar(); } } 公共类栏实现了Foo{ B
public interface Foo<T> {
T someMethod();
}
公共接口Foo{
T somethod();
}
有没有办法确保当某个类实现这个接口时,泛型类型是同一个implementig类
例如:
public class Bar implements Foo<Bar> {
Bar someMethod() {
return new Bar();
}
}
公共类栏实现了Foo{
Bar方法(){
返回新条();
}
}
我不能在这个网站上提交一个简单的“否”(正文太短),所以就这样吧
否。否,不能引用实现类。你所能做的就是:
public interface Foo<T extends Foo<?> > {
T someMethod();
}
您可以定义一个类Bar2
public class Bar2 implements Foo<Bar2 > {
@Override
public Bar2 someMethod() {
return new Bar2();
}
}
最初的问题是,您是否可以像Bar
did那样对界面的使用做好准备
答案是:不。
编辑:
安吉丽卡·兰格(Angelika Langer)对这一点给出了很好的解释,这一点无法实现,因为 编辑: 我被否决了,这里有更多的解释:
public interface Foo<T>;
公共接口Foo;
T
在运行时,上面的选项可用,因此无法对其进行检查。但是,可以自定义注释,可以执行此操作。 < >强>是,可以这样做(排序;参见下文)。<强>(在C++世界中,这称为“”,但它也适用于java):
使用
,上述内容将无法编译;有了
,它就可以了。但这只是吹毛求疵;它不会改变tangens的中心点,即给定一个已经有效的Recur
实现,您可以让后续实现使用已经有效的类型,而不是它本身。我仍然认为这是有价值的,但这并不比tangens的答案更有价值
最后,如果可以的话,继续投票给tangens的答案。(tangens,你应该点击你的帖子,这样我也可以投票给你。)他们的观点很好,很抱歉我第一次错过了。谢谢,唐根 是的,我否决了你。我说的不是运行时类型检查——当然这在Java中是不可能的——但OP的问题不是问这个,因为你没有回答OP的问题。OP的问题是:如何确保使用实现了
Foo
的类型Bar
,它只能实现Foo
,而不能实现Foo
(例如)。这是可能的,例如使用java.util.Enum
就可以做到。因为你错了?下面的下一个答案显示了一个模式的链接,以及确保实现类使用基类而不是任何旧类的工作循环模板的示例。我无法理解为什么要接受它。这篇专栏文章应该更清楚地阐明他的实际问题。我添加了一个例子,说明为什么@chris jester young的答案并不比我的好。你说得对,谢谢你的反例。我会更新我的答案。使用
与
之间仍然存在差异,但这只是在这一点上令人毛骨悚然,并没有实质性地改变答案的字符。对于答案:+1;对其他答案投反对票:-1;承认它:+1=+1
public class Bar implements Foo<Bar2 > {
@Override
public Bar2 someMethod() {
return new Bar2();
}
}
public interface Foo<T>;
public interface Recur<T extends Recur<T>> {
// ...
}
public interface Recur<T extends Recur<T>> {
T foo();
}
class A implements Recur<B> {
@Override
public B foo() {
return new B();
}
}
class B implements Recur<A> {
@Override
public A foo() {
return new A();
}
}