【问题标题】:Cannot instantiate the type with regular Class无法使用常规类实例化类型
【发布时间】:2016-07-06 02:49:07
【问题描述】:

所以我有课:

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 两者都不是...

任何帮助都会很棒。

谢谢!

【问题讨论】:

  • 使用菱形运算符很好。我在 eclipse mars 中遇到过这个错误消息,真正的原因实际上是缺少导入。确保您没有任何错误,例如缺少 AMoDQSSimProvider 的导入或奇怪的类名中的拼写错误等。
  • 你的jdk版本是多少?
  • 我刚刚安装了最新版本的 JDK,并从我的终端得到了这个:'java version "1.8.0_91" Java(TM) SE Runtime Environment (build 1.8.0_91-b14) Java HotSpot(TM ) 64 位服务器 VM(内部版本 25.91-b14,混合模式)' 我仍然遇到“无法推断类型”的问题......

标签: java eclipse generics type-inference


【解决方案1】:

我想您使用的是 JDK 7。如果是这种情况,new DynQSimModule&lt;&gt;(AMoDQSimProvider.class) 将无法编译,因为 Java 7 不使用目标类型来推断传递参数的类型。

new DynQSimModule&lt;? extends Mobsim&gt;(AMoDQSimProvider.class) 也不会编译,因为您不能在对象创建中使用通配符。

要解决此问题,您必须在 new DynQSimModule&lt;&gt;(...) 中提供确切类型,或者如果可能,您可以升级到提供目标类型推断功能的 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+
}

更多关于 Java 8 Target Type Inference.

【讨论】:

  • 我在我的终端中做了 java -version 并得到:java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM(构建 25.65-b01,混合模式)我假设我必须安装 JDK 而不是 JRE?
  • 您可以使用javac -version 来检查您的JDK 版本。如果是JDK 7,那么是的,你需要安装JDK 8。
  • 上面写着javac 1.8.0_91,这是否意味着我正在运行JDK 8?
  • 是的。你是如何编译你的代码的?使用某些 IDE 或从命令行?
  • 我在 Eclipse 中运行代码。我按照谷歌的一些步骤,显然在 Eclipse 上运行 JDK 8,所以我很困惑为什么会这样。我会再次检查。
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 2014-12-30
  • 2019-07-26
  • 2013-09-27
  • 2015-04-30
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
相关资源
最近更新 更多