无法使用常规Class实例化类型

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既不是那些......

任何帮助都会很棒.

谢谢!

sud*_*d29 2

我想您使用的是 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目标类型推断的更多信息。