<t extends =“”enum <t =“”>&gt; T []作为Java 8中的返回类型

时间:2016-10-25 14:24:10

标签: generics java-8

我正在查看一些在java 7中编译但无法在Java 8中编译的代码。

class Test {
    public <T extends Enum<T>> T[] doSomething(...) {...}

    public <T extends Enum<T>> T[] methodWhichCallsDoSomething() {
        ...
        return doSomething(...);
}

错误如下:

incompatible types: inference variable T has incompatible upper bounds java.lang.Enum<T>,T

我正在运行jdk 1.8.0_71。

有没有人知道使用Java 8编译和工作的变通方法或解决方案?

编辑:对于在括号前面的col调用doSomething()的行给出了错误消息。

1 个答案:

答案 0 :(得分:3)

问题是由您传递给doSomething的内容引起的。您没有发布实际参数,但是从签名中我们可以推断出,如果doSomething的参数中至少有一个以任何方式引用T,则methodWhichCallsDoSomething是不可能的提供正确的参数(除非所有都是null),因为没有适当的变量在范围内。

由于编译器错误或未经检查的操作,很可能编译了代码,在任何一种情况下,由于新的类型推断规则,这种行为确实可能已经改变。

methodWhichCallsDoSomething()这样的无参数方法承诺返回调用者所希望的任何T[],无论如何都会被打破。类似的反模式有几个例子,现在在Java 8下失败,如thisthis。如果这样的代码恰好在早期版本中运行,那么它恰好是偶然发生的,现在发生的问题实际上已经存在了。

对于这样的破解代码,现在得到一个编译器错误,可能的症状是更好的,因为有时代码仍会编译,但会在运行时突然中断。