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

2022-09-05 00:08:48

此代码不编译。我想知道我做错了什么:

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

其中 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));

感谢您的任何帮助!

所有解决方案

Class<? extends Importable> c = Class.forName(s).asSubclass(Importable.class);

Class<? extends Importable> c = (Class<? extends Importable>) Class.forName(s);

Class<?> c = Class.forName(format(s));
Importable i = (Importable)c.newInstance();

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

Exception in thread "main" java.lang.IncompatibleClassChangeError: class C1 
has interface Importable as super class

其中 C1 实际上是在实现 Importable(因此理论上它是可转换为 Importable 的)。


答案 1

使用运行时转换:

Class <? extends Importable>  c
    = Class.forName (s).asSubclass (Importable.class);

如果指定了未实现接口的类,这将在运行时发出异常的吠叫。s


答案 2

尝试:

Class<? extends Importable> klaz = Class.forName(s).asSubclass(Importable.class);

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

Class<CharSequence> klazz = String.class; // doesn't compile!
// "Type mismatch: cannot convert from Class<String> to Class<CharSequence>"

然而:

Class<? extends CharSequence> klazz = String.class; // compiles fine!

所以对于一个,你肯定需要上限通配符。正如 doublep 所建议的那样。interfaceasSubclass

接口链接

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

相关问题

另请参见