以下代码在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替换泛型和其他更改使它编译。 ]
答案 0 :(得分:3)
看起来类型推断在这一行上没有按预期工作:
final IExporter<O> localExporter =
determineExporter(getPersistentInterface(objType));
我认为问题是O
中getPersistentInterface()
正在解决的问题。它被称为好像你已经调用this.<Object, O>getPersistentInterface(...)
。如果你是明确的:
final IExporter<O> localExporter =
determineExporter(this.<O, O>getPersistentInterface(objType));
它工作正常。