泛型 - 将方法返回类型扩展到类

3

我想在Java 6中实现这个:

abstract class CurrClass{
    public <T extends CurrClass> T setField (String str) {
        return this;
    }
}

编译器报错:错误:类型不匹配,无法将 CurrClass 转换为 T。

添加强制类型转换可以解决问题,但会产生 警告"return (T) this;"

有没有更简洁的语法来解决这个问题?为什么需要进行强制类型转换?


1
为什么在设置方法中返回正在操作的实例?不返回任何内容并继续操作即可,除非这只是为了问题而不是真正的代码。 - Jonathan Drapeau
@GriffeyDog,我想将一些继承的setter与CurrClass的setter混合使用。 - Paddy
我仍然不明白为什么你要返回实例,因为它并没有添加任何有用的东西,而且如果你在设置器中创建新实例,那么不返回实例也不会影响流畅性...但由于这与问题不符,我不会进一步讨论这个问题。 - Jonathan Drapeau
@Paddy 我仍然没有看到这里需要泛型的必要性。 - GriffeyDog
@JonathanDrapeau 方法级联应该在现有实例上工作。 - Paddy
显示剩余6条评论
2个回答

6
返回类型比返回的对象更为严格,这就是编译器生成错误(和随后的警告)的原因。考虑以下情况:
class A extends CurrClass {}
class B extends CurrClass {}

...

A myObject = new B().setField("stringhere");

这在您的设置中是完全合法的,但会导致 ClassCastException。因此,通常我们只返回比签名要求更严格的类型。

哦,我完全忽略了那个。 - Paddy
@Paddy 这个问题中有几个有用的模式[https://dev59.com/CnE95IYBdhLWcg3wMrEB],可能对你有帮助。 - blgt
这似乎是我遇到的确切问题。将当前问题标记为重复。 - Paddy

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("");,因为多态性可以为我们带来便利。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接