You*_*ndy 5 java eclipse generics type-inference
所以我有一节课:
public class DynQSimModule<T extends Mobsim> extends AbstractModule
{
private Class<? extends javax.inject.Provider<? extends T>> providerClass;
public DynQSimModule(Class<? extends javax.inject.Provider<? extends T>> providerClass)
{
this.providerClass = providerClass;
}
//some methods down here
}
Run Code Online (Sandbox Code Playgroud)
当我试着打电话时:
controler.addOverridingModule(new DynQSimModule<>(AMoDQSimProvider.class));
Run Code Online (Sandbox Code Playgroud)
Eclipse告诉我它"无法推断DynQSimModule <>的类型参数.我明白这是因为我没有在<>中添加任何内容,但我构建的示例代码使用相同的语法并且运行完全正常...
当我输入类似的东西:
controler.addOverridingModule(new DynQSimModule<? extends Mobsim(AMoDQSimProvider.class));
Run Code Online (Sandbox Code Playgroud)
Eclipse告诉我:"无法实例化DynQSimModule类型."
我知道当你尝试实例化一个接口或抽象类时这是一个问题,但DynQSimModule既不是那些......
任何帮助都会很棒.
谢谢!
我想您使用的是 JDK 7。如果是这种情况,new DynQSimModule<>(AMoDQSimProvider.class)
将无法编译,因为 Java 7 不使用目标类型来推断传递参数的类型。
new DynQSimModule<? extends Mobsim>(AMoDQSimProvider.class)
也不会编译,因为您不能在对象创建中使用通配符表示法。
要解决此问题,您必须提供准确的类型new DynQSimModule<>(...)
,或者如果可能的话,您可以升级到提供目标类型推断功能的 Java 8。
例如,下面的代码不会在 Java 7 中编译,但会在 Java 8+ 中编译:
public static void test(List<String> list) {
// some code
}
public static void main(String[] args) {
test(new ArrayList<>()); // will not compile in Java 7 but it is legal in Java 8+
}
Run Code Online (Sandbox Code Playgroud)
有关 Java 8目标类型推断的更多信息。