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
指定了一个没有实现接口的类,那么在运行时会出现异常.
尝试:
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建议的.
<U> Class<? extends U> asSubclass(Class<U> clazz)
Class
对象以表示由指定的类对象表示的类的子类.检查强制转换是否有效,ClassCastException
如果不是则抛出a .如果此方法成功,则它始终返回对此类对象的引用.