javac:需要不兼容的类型:classname <typeparam> found:classname <java.lang.object> </java.lang.object> </typeparam>

时间:2013-01-22 05:01:21

标签: java generics javac java-7

以下代码在JDK6中编译。在JDK7中因编译错误而失败。

java: incompatible types
  required: com.jdk7.IExporter<O>
  found:    com.jdk7.IExporter<java.lang.Object>

编译器是1.7.0_10,来自Oracle。

$ javac -version
javac 1.7.0_10

代码

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> {
}

[为了完整起见, 用IExporter替换泛型和其他更改使它编译。 ]

1 个答案:

答案 0 :(得分:3)

看起来类型推断在这一行上没有按预期工作:

final IExporter<O> localExporter = 
            determineExporter(getPersistentInterface(objType));

我认为问题是OgetPersistentInterface()正在解决的问题。它被称为好像你已经调用this.<Object, O>getPersistentInterface(...)。如果你是明确的:

final IExporter<O> localExporter = 
            determineExporter(this.<O, O>getPersistentInterface(objType));

它工作正常。