Class <T>和静态方法Class.forName()让我发疯

Met*_*etz 10 java generics reflection

此代码无法编译.我想知道我做错了什么:

private static Importable getRightInstance(String s) throws Exception {
 Class<Importable> c = Class.forName(s);
 Importable i = c.newInstance();
 return i;
}
Run Code Online (Sandbox Code Playgroud)

其中Importable是接口,字符串s是实现类的名称.编译器说:

./Importer.java:33: incompatible types
found   : java.lang.Class<capture#964 of ?>
required: java.lang.Class<Importable>
  Class<Importable> c = Class.forName(format(s));
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

所有的解决方案

Class<? extends Importable> c = Class.forName(s).asSubclass(Importable.class);
Run Code Online (Sandbox Code Playgroud)

Class<? extends Importable> c = (Class<? extends Importable>) Class.forName(s);
Run Code Online (Sandbox Code Playgroud)

Class<?> c = Class.forName(format(s));
Importable i = (Importable)c.newInstance();
Run Code Online (Sandbox Code Playgroud)

给出这个错误(我不明白):

Exception in thread "main" java.lang.IncompatibleClassChangeError: class C1 
has interface Importable as super class
Run Code Online (Sandbox Code Playgroud)

其中C1实际上是实现可导入的(因此它理论上可以转换为可导入的).

dou*_*lep 32

使用运行时转换:

Class <? extends Importable>  c
    = Class.forName (s).asSubclass (Importable.class);
Run Code Online (Sandbox Code Playgroud)

如果s指定了一个没有实现接口的类,那么在运行时会出现异常.

  • +1避免丑陋演员的好方法.我不知道这个. (4认同)

pol*_*nts 7

尝试:

Class<? extends Importable> klaz = Class.forName(s).asSubclass(Importable.class);
Run Code Online (Sandbox Code Playgroud)

以下是一些说明问题的片段:

Class<CharSequence> klazz = String.class; // doesn't compile!
// "Type mismatch: cannot convert from Class<String> to Class<CharSequence>"
Run Code Online (Sandbox Code Playgroud)

然而:

Class<? extends CharSequence> klazz = String.class; // compiles fine!
Run Code Online (Sandbox Code Playgroud)

所以对于一个interface,你肯定需要上限通配符.这asSubclass是由doublep建议的.

API链接

  • <U> Class<? extends U> asSubclass(Class<U> clazz)
    • 转换此Class对象以表示由指定的类对象表示的类的子类.检查强制转换是否有效,ClassCastException如果不是则抛出a .如果此方法成功,则它始终返回对此类对象的引用.

相关问题

也可以看看