Generics <;T扩展枚举<;T>&燃气轮机;T[]在Java8中作为返回类型

Generics <;T扩展枚举<;T>&燃气轮机;T[]在Java8中作为返回类型,generics,java-8,Generics,Java 8,我正在看一些用Java7编译但不能用Java8编译的代码 class Test { public <T extends Enum<T>> T[] doSomething(...) {...} public <T extends Enum<T>> T[] methodWhichCallsDoSomething() { ... return doSomething(...); } 类测试{ 公共T[]

我正在看一些用Java7编译但不能用Java8编译的代码

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

    public <T extends Enum<T>> T[] methodWhichCallsDoSomething() {
        ...
        return doSomething(...);
}
类测试{
公共T[]doSomething(…){…}
公共T[]方法,该方法称为dosomething(){
...
返回剂量测定法(…);
}
错误如下:

incompatible types: inference variable T has incompatible upper bounds java.lang.Enum<T>,T
不兼容类型:推理变量T的上限不兼容java.lang.Enum,T
我正在运行JDK1.8.071

有没有人知道一种变通方法或解决方案可以让它在Java8中编译和工作


编辑:为调用doSomething()的行提供错误消息,用于括号前的列。

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

很可能是由于编译器错误或未经检查的操作而编译了代码,并且在任何一种情况下,都有可能是由于新的类型推断规则而改变了此行为

一种无参数的方法,如
methodWhichCallsDoSomething()
承诺返回任何
T[]
调用者希望的,无论如何都是坏的。有几个类似的反模式的例子,现在在Java 8下失败了,比如和。如果这些代码碰巧在早期版本中工作,那么它碰巧工作了,而现在发生的问题实际上以前就已经存在了


对于这种损坏的代码,现在出现编译器错误是最好的可能症状,因为有时代码仍在编译,但在运行时会突然损坏。

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

很可能是由于编译器错误或未经检查的操作而编译了代码,并且在任何一种情况下,都有可能是由于新的类型推断规则而改变了此行为

一种无参数的方法,如
methodWhichCallsDoSomething()
承诺返回任何
T[]
调用者希望的,无论如何都是坏的。有几个类似的反模式的例子,现在在Java 8下失败了,比如和。如果这些代码碰巧在早期版本中工作,那么它碰巧工作了,而现在发生的问题实际上以前就已经存在了


对于这种损坏的代码,现在出现编译器错误是最好的可能症状,因为有时代码仍在编译,但在运行时会突然损坏。

我想知道为什么要这样做。如果代码中有多个方法使用同一个T,为什么不将其放在类中?每个Java 8版本都可以编译。也许吧问题在于
部分。您如何确保它针对每个版本进行编译?我不会称之为“进一步信息”。当编译器拒绝您的方法调用时,它是通过指向第一个
d
还是最后一个
或介于两者之间的某个位置来拒绝,这无关紧要。关于您的另一个问题,我使用一个脚本对其进行了测试,该脚本运行于所有JDK版本并编译指定的代码。如果
doSomethin中至少有一个g
的参数以任何方式引用
T
方法调用osomething
都不可能提供正确的参数(除非所有参数都
null
),因为作用域中没有合适的变量。很可能是由于编译器错误或未检查的操作而编译的代码,并且在任何情况下,都确实可能发生了更改。一个无参数的方法,如
methodwhichcallsDosMething()
承诺返回任何
T[]
调用者希望的,无论如何都是坏的。有几个类似的反模式的例子,在Java 8下失败了。我想知道你为什么要这样做。如果你的代码中有多个方法使用相同的T,为什么不把它放在类中呢?每个Java 8版本都可以编译。可能问题在于
部分.H你是如何确保它针对每个版本编译的?我不会称之为“进一步的信息”。当编译器拒绝您的方法调用时,它是通过指向第一个
d
还是最后一个
或介于两者之间的某个位置来拒绝,这无关紧要。关于您的另一个问题,我使用一个脚本对其进行了测试,该脚本运行于所有JDK版本并编译指定的代码。如果
doSomethin中至少有一个g
的参数以任何方式引用
T
方法调用osomething
都不可能提供正确的参数(除非所有参数都
null
),因为作用域中没有合适的变量。很可能是由于编译器错误或未检查的操作而编译的代码,并且在任何情况下,都确实可能发生了更改。一个无参数的方法,如
methodwhichcallsDosMething()
承诺返回任何
T[]
调用者希望的是,它已经被破坏了。有几个类似的反模式的例子,现在在Java 8下失败了。