Generics <;T扩展枚举<;T>&燃气轮机;T[]在Java8中作为返回类型
我正在看一些用Java7编译但不能用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[]
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
的内容引起的。您没有发布实际参数,但从签名我们可以推断,如果至少有一个fdoSomething
的参数以任何方式引用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下失败了。