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();
    }
}