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

时间:2014-07-17 14:44:59

标签: java generics

我试图在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;"

添加演员作品

是否有更清晰的语法来执行此操作?为什么演员需要?

2 个答案:

答案 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 可以为我们带来便利。