以下代码在JDK6中编译。在JDK7中失败,出现编译错误。

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


来自Oracle的编译器是1.7.0_10。

$ 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替换常规,其他更改使其可以编译。 ]

最佳答案

看起来类型推断在此行上无法正常工作:

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


我认为问题是OgetPersistentInterface()中正在解决。就像您已调用this.<Object, O>getPersistentInterface(...)一样被调用。如果您是明确的:

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


它工作正常。

09-08 02:20