我正在查看一些在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()的行给出了错误消息。
答案 0 :(得分:3)
问题是由您传递给doSomething
的内容引起的。您没有发布实际参数,但是从签名中我们可以推断出,如果doSomething
的参数中至少有一个以任何方式引用T
,则methodWhichCallsDoSomething
是不可能的提供正确的参数(除非所有都是null
),因为没有适当的变量在范围内。
由于编译器错误或未经检查的操作,很可能编译了代码,在任何一种情况下,由于新的类型推断规则,这种行为确实可能已经改变。
像methodWhichCallsDoSomething()
这样的无参数方法承诺返回调用者所希望的任何T[]
,无论如何都会被打破。类似的反模式有几个例子,现在在Java 8下失败,如this和this。如果这样的代码恰好在早期版本中运行,那么它恰好是偶然发生的,现在发生的问题实际上已经存在了。
对于这样的破解代码,现在得到一个编译器错误,可能的症状是更好的,因为有时代码仍会编译,但会在运行时突然中断。