有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法用常规类实例化该类型

所以我有一门课:

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
}

当我试着打电话时:

controler.addOverridingModule(new DynQSimModule<>(AMoDQSimProvider.class));

Eclipse告诉我它“无法推断DynQSimModule<;>;的类型参数。我理解这是因为我没有在<;>;中放入任何内容,但我构建的示例代码使用了相同的精确语法,运行非常好

当我输入如下内容时:

controler.addOverridingModule(new DynQSimModule<? extends Mobsim(AMoDQSimProvider.class));

Eclipse告诉我:“无法实例化类型DynQSimModule。”

我知道当您尝试实例化一个接口或抽象类时,这是一个问题,但是DynQSimModule不是这些

任何帮助都会很好

谢谢


共 (1) 个答案

  1. # 1 楼答案

    我想您正在使用JDK 7。如果是这种情况,new DynQSimModule<>(AMoDQSimProvider.class)将不会编译,因为Java7不使用目标类型来推断所传递参数的类型

    new DynQSimModule<? extends Mobsim>(AMoDQSimProvider.class)也不会编译,因为不能在对象创建中使用通配符

    要解决这个问题,您必须在new DynQSimModule<>(...)中提供确切的类型,或者如果可能,您可以升级到提供目标类型推断功能的Java8

    例如,下面的代码不会在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+
    }
    

    更多关于Java8Target Type Inference