2016-07-06 116 views
5

所以我有一个类:无法实例与普通类类型

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 <> 。我明白这是因为我没有把任何东西放在<>中,但是我构建的示例代码使用相同的确切语法并且运行得非常好......

Whe ñ我把这样的:

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

Eclipse的告诉我:“不能实例类型DynQSimModule”

我知道,当你试图实例化一个接口或抽象类,但DynQSimModule这是一个问题是不是那些...

任何帮助将是伟大的。

谢谢!

+1

使用钻石算子很好。我用eclipse mars遇到过这个错误信息,真正的原因实际上是缺少导入。确保你没有任何错误,例如缺少AMoDQSSimProvider导入或奇怪类名中的拼写错误等。 –

+0

什么是您的jdk版本? –

+0

我刚刚安装了最新版本的JDK,并得到这个从我的终端: “Java版本 “1.8.0_91” 的Java(TM)SE运行时环境(建立1.8.0_91-B14) 的HotSpot的Java(TM)64位服务器VM(建25.91〜B14,混合模式)” 我仍然虽然具有‘不能推断类型’的问题... –

回答

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+ 
} 

更多关于Java 8 Target Type Inference

+0

我确实在我的终端Java的版本,并得到: Java版本“1.8.0_65 “ Java™SE运行时环境(内部版本1.8.0_65-b17) Java HotSpot™64位服务器虚拟机(版本25.65-b01,混合模式) 我假设我必须安装JDK而不是JRE ? –

+0

您可以使用'javac -version'来检查您的JDK版本。如果是JDK 7那么是的,你需要安装JDK 8. –

+0

它说'javac 1.8.0_91',这是否意味着我正在运行JDK 8? –