泛型 - 方法返回类型作为扩展类

Pad*_*ddy 3 java generics

我试图在Java 6中实现这一点:

abstract class CurrClass{
    public <T extends CurrClass> T setField (String str) {
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨错误:Type mismatch: cannot convert from CurrClass to T.

添加演员作品,并附上警告:"return (T) this;"

有没有更清晰的语法来做到这一点?为什么演员需要?

blg*_*lgt 6

返回类型比返回的对象更具限制性.这就是编译器生成错误(以及后续警告)的原因.考虑这种情况:

class A extends CurrClass {}
class B extends CurrClass {}

...

A myObject = new B().setField("stringhere");
Run Code Online (Sandbox Code Playgroud)

这在您的设置中完全合法,但会产生一个ClassCastException.

这就是为什么通常我们只返回比签名要求严格的类型.