我试图在Java 6中实现这个目标:
abstract class CurrClass{
public <T extends CurrClass> T setField (String str) {
return this;
}
}
编译器抱怨错误:Type mismatch: cannot convert from CurrClass to T.
使用警告:"return (T) this;"
是否有更清晰的语法来执行此操作?为什么演员需要?
答案 0 :(得分:6)
返回类型比返回的对象更具限制性。这就是编译器生成错误(以及后续警告)的原因。请考虑以下情况:
class A extends CurrClass {}
class B extends CurrClass {}
...
A myObject = new B().setField("stringhere");
这在您的设置中完全合法,但会产生ClassCastException
。
这就是为什么我们通常只返回更多限制类型,而不是签名要求。
答案 1 :(得分:1)
为什么需要演员?
因为this
是CurrClass而方法setField()想要返回它的扩展类。
Super super = new Sub(); //it's fine, no casting is needed
Sub sub = new Super(); //error!! -->what you do
是否有更清晰的语法来执行此操作?
如果你想要SubClass s = super.setField("");
,你必须施展。
但我们经常Super s = sub.setField("");
polymorphism 可以为我们带来便利。