让我们从一个代码示例开始,理想情况下,我希望可以这样做。
由于MyOtherClass是通用的
class MyOtherClass<Z>{}
我想获得MyOtherClass的Z
class C<T extends MyOtherClass<Z>> {
Z myTypeOfReturnMethod() { return doStuff(); }
}
不幸的是,据我所知,我无法指定,唯一有效的语法是
class C<T extends MyOtherClass> {
???MyOtherClass.Z??? myTypeOfReturnMethod() { return doStuff(); }
}
最好的方法是什么? C可能有两个泛型,但它有点重复且容易出错。
答案 0 :(得分:3)
“简单”的解决方案是通过显式引入它来告诉java有关额外的类型约束:
class C<Z, T extends MyOtherClass<Z>> {
// ...
}
虽然这意味着你可以在你的类型声明中感觉到冗余,但至少你实际上得到了你想要的东西......
Java在语义上不支持其他所有内容,主要是因为在TypeBound of T中你拥有的Z不能作为类型参数(在JLS 8.1.2意义上)访问,而是TypeBound。您要使用Z
的地方尚不了解Z
,因为尚未明确将其作为类型参数引入并被删除。即使myTypeOfReturnMethod
的签名更改为Object
,也会发生编译错误,这尤其证明了这一点。结果仍然是:
error: cannot find symbol class C<T extends MyOtherClass<Z>> { ^ symbol: class Z
除此之外,你最想要的东西是“更加多余”(咳嗽),即:
class C<Z, T extends MyOtherClass<? extends Z>> {
实际上与上面的一个非常不同,原因在很多SO问题和JLS中都有概述...