Java泛型,在C <t extends =“”myclass <z =“”>&gt;中,一个方法应该返回Z

时间:2017-04-10 23:25:39

标签: java generics

让我们从一个代码示例开始,理想情况下,我希望可以这样做。

由于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可能有两个泛型,但它有点重复且容易出错。

1 个答案:

答案 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中都有概述...