扩展类的Java泛型未检查警告

扩展类的Java泛型未检查警告,java,generics,Java,Generics,我有以下代码: public class Foo { interface Coo<T> { public T cool(); } abstract class Bar<T extends Bar<T>> implements Coo<T> { @SuppressWarnings("unchecked") T doSomething() { ret

我有以下代码:

public class Foo {

    interface Coo<T> {
        public T cool();
    }

    abstract class Bar<T extends Bar<T>> implements Coo<T>  {

        @SuppressWarnings("unchecked")
        T doSomething() {
            return (T) this;
        }

        @SuppressWarnings("unchecked")
        @Override
        public T cool() {
            return (T) this;
        }

    }

    class FooBar extends Bar<FooBar> {
        @Override
        public FooBar cool() {
            return super.cool();
        }

    }
}
为什么对此对象类型的强制转换不安全?当Bar实现Coo时,通用的说法不是说返回的COL必须是t类型,它扩展了Bar或其子类吗?

因为Bar中的类型是Bar而不是t,编译器会为BADOSOmething生成警告。以下内容不会生成任何警告:

abstract class Bar<T extends Bar<T>> {

    Bar<T> doSomething() {
        return this;
    }

}
Barcool的主体认为这是T的一个亚型,但事实并非如此。在Barcool中,它具有类型Bar,并且是Coo的子类型,但不是T。

因为在Bar中具有类型Bar而不是T,编译器会为BardoMething生成警告。以下内容不会生成任何警告:

abstract class Bar<T extends Bar<T>> {

    Bar<T> doSomething() {
        return this;
    }

}
Barcool的主体认为这是T的一个亚型,但事实并非如此。在Barcool中,它有Bar类型,是Coo的一个子类型,但不是T。

T扩展Bar,但Bar类型不扩展T

想象

class A extends Bar<A> { ... }
class B extends Bar<A> { ... }
这显然是不对的

用泛型做你想做的是不可能的。这是人们的一大误解。他们认为递归边界将允许您执行自类型。但是递归边界在Java中几乎没有用处。在你看到人们编写界面栏的99%的地方,编写界面栏和编写界面栏一样好。

T扩展了界面栏,但这种类型的界面栏并不扩展T

想象

class A extends Bar<A> { ... }
class B extends Bar<A> { ... }
这显然是不对的


用泛型做你想做的是不可能的。这是人们的一大误解。他们认为递归边界将允许您执行自类型。但是递归边界在Java中几乎没有用处。99%你看到人们编写界面栏的地方,编写界面栏和编写界面栏一样好。

如果你一起去掉了界面,你仍然会得到同样的警告。那么正确的方法是什么?我基本上想说,在cool中,我想返回一个对象,它既是Bar类型的对象,又是它的子cass和Coo。@学生01:既然Bar实现了Coo,那么返回一个Bar类型的对象就足够了。@hoaz:是的,我刚才说的是doSomething。我被困在同一个地方,有趣的是,他试图实现的目标是,如果你把界面全部去掉,你仍然会得到同样的警告。那么,正确的方法是什么呢?我基本上想说,在cool中,我想返回一个对象,它既是Bar类型的对象,又是它的子cass和Coo。@学生01:既然Bar实现了Coo,那么返回一个Bar类型的对象就足够了。@hoaz:是的,我刚才说的是doSomething。我被困在同一个地方,他想达到的目标很有趣你想达到的目标是什么?酒吧似乎是个更好的选择。你想达到什么目的?看来酒吧可能是个更好的选择