javac:需要不兼容的类型:classname<;TYPEPARAM>;找到:classname<;java.lang.Object>;
以下代码在JDK6中编译。在JDK7中失败,出现编译错误javac:需要不兼容的类型:classname<;TYPEPARAM>;找到:classname<;java.lang.Object>;,java,generics,javac,java-7,Java,Generics,Javac,Java 7,以下代码在JDK6中编译。在JDK7中失败,出现编译错误 java: incompatible types required: com.jdk7.IExporter<O> found: com.jdk7.IExporter<java.lang.Object> 代码 package com.jdk7; 公共类泛型7{ 公共IExporter getExporter(类objType){ 最终IExporter localExporter= determine
java: incompatible types
required: com.jdk7.IExporter<O>
found: com.jdk7.IExporter<java.lang.Object>
代码
package com.jdk7;
公共类泛型7{
公共IExporter getExporter(类objType){
最终IExporter localExporter=
determineExporter(getpersistenterface(objType));
返回null;
}
专用IExporter确定导出器(类persistentInterface){
返回null;
}
受保护类getPersistentInterface(类clazz){
返回null;
}
}
类导出器{
}
[为了完整起见,
用IExporter替换generic和其他更改使其可编译。]看起来类型推断并不像您在这一行中预期的那样工作:
final IExporter<O> localExporter =
determineExporter(getPersistentInterface(objType));
它工作得很好。两者都使用纯javac吗?Ie,没有ecj或任何东西?修复了Java中不兼容的Bug@user1983527:谢谢你的帮助。我在发布问题时进行了检查。无法真正将错误与此处的任何内容联系起来。@Mark Peters:谢谢。这是虫子吗?IntelliJ在编辑时不显示任何警告。@Jayan:我不确定这是否是一个bug。在推断泛型参数时,发现IntelliJ和javac不一致并不十分罕见。我发现围绕通用细微差别的JLS很难解析,所以我不打算尝试将其应用于这种情况:-)。一个测试可能是使用ecj进行尝试,看看是否得到相同的结果。Java在类型推断方面从来都不是一流的。当提示来自赋值时效果很好,在简单表达式中可以,当提示来自另一个泛型方法的参数类型时效果不太好。@Mark Peters:谢谢。很高兴了解更多这方面的情况。
package com.jdk7;
public class GenericIn7 {
public <O> IExporter<O> getExporter(Class<O> objType) {
final IExporter<O> localExporter =
determineExporter(getPersistentInterface(objType));
return null;
}
private <O> IExporter<O> determineExporter(Class<O> persistentInterface) {
return null;
}
protected <O, I extends O> Class<O> getPersistentInterface(Class<I> clazz) {
return null;
}
}
class IExporter<T> {
}
final IExporter<O> localExporter =
determineExporter(getPersistentInterface(objType));
final IExporter<O> localExporter =
determineExporter(this.<O, O>getPersistentInterface(objType));