我试图在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;"
有没有更清晰的语法来做到这一点?为什么演员需要?
返回类型比返回的对象更具限制性.这就是编译器生成错误(以及后续警告)的原因.考虑这种情况:
class A extends CurrClass {}
class B extends CurrClass {}
...
A myObject = new B().setField("stringhere");
Run Code Online (Sandbox Code Playgroud)
这在您的设置中完全合法,但会产生一个ClassCastException.
这就是为什么通常我们只返回比签名要求更严格的类型.