扩展类的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。我被困在同一个地方,他想达到的目标很有趣你想达到的目标是什么?酒吧似乎是个更好的选择。你想达到什么目的?看来酒吧可能是个更好的选择