javac:需要不兼容的类型:classname<;TYPEPARAM>;找到:classname<;java.lang.Object>;

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

以下代码在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=
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));