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

Java 泛型-方法返回类型作为扩展类,java,generics,Java,Generics,我试图用Java 6实现这一点: abstract class CurrClass{ public <T extends CurrClass> T setField (String str) { return this; } } 抽象类{ 公共T设置字段(字符串str){ 归还这个; } } 编译器抱怨错误:类型不匹配:无法从CurrClass转换为T。 添加演员作品,带有警告:“返回(T)this;” 是否有更清晰的语法来执行此操作?为什么需要强

我试图用Java 6实现这一点:

abstract class CurrClass{
    public <T extends CurrClass> T setField (String str) {
        return this;
    }
}
抽象类{
公共T设置字段(字符串str){
归还这个;
}
}
编译器抱怨错误
类型不匹配:无法从CurrClass转换为T。

添加演员作品,带有警告
“返回(T)this;”


是否有更清晰的语法来执行此操作?为什么需要强制转换?

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

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

...

A myObject = new B().setField("stringhere");
这在您的设置中是完全合法的,但会导致
ClassCastException

这就是为什么我们通常只返回比签名调用更严格的类型

为什么需要演员

因为
this
是CurrClass,方法setField()希望返回它的扩展类

Super super = new Sub();   //it's fine, no casting is needed
Sub sub = new Super();     //error!! -->what you do
是否有更清晰的语法来执行此操作

如果您想
子类s=super.setField(“”),您必须强制转换


但是我们经常做
Super s=sub.setField(“”)
for可以给我们带来方便。

您想返回
CurrClass
还是它的子类?@Tony,一个子类。所以,我可以说子类s=s.setField(“”);为什么要用set方法返回正在处理的实例?不归还任何东西,继续工作。除非这只是问题的目的,而不是真正的代码。如果要返回
this
,那么为什么该方法定义为泛型类型?它应该被定义为
public CurrClass setField(String str)
@JonathanDrapeau,我正在努力保持API的流畅性。。我完全忽略了这一点。@Paddy有几个有用的模式可能对你有用这似乎正是我遇到的问题。将当前问题标记为重复问题。