我有以下类/接口的设置。
接口IFoobar
实现IFoobar的BaseClass类是抽象的
类ConcreteClassA扩展BaseClass
扩展BaseClass的ConcreteClassB类
扩展BaseClass的ConcreteClassC类
我有一个方法需要传递上述具体类的java.lang.Class实例。我是这样宣布的。
void doSomething(String id, Class<IFoobar> c)
但是,当我尝试编译时,java或多或少会报错,如下所示:
doSomething(java.lang.String,java.lang.Class<IFoobar>) in javaclass cannot be applied to
(java.lang.String,java.lang.Class<ConcreteClassA>)
register("12345", ConcreteClassA.class);
^
1 error
我只是最近才需要使用java.lang.Class来做事情,所以我想我缺少了一些简单的东西。我本来希望类型化的类声明像普通参数一样工作,因为具体的类被识别为接口的实例,但是显然并非如此。
我尝试了各种转换方法,等等,或者没有获得预期的结果,或者代码无效。因此,关于我需要做什么的任何想法将不胜感激。
提前致谢。
最佳答案
类型为Class<IFoobar>
的变量只能保存对Class<IFoobar>
对象的引用,而不能保存Class<ConcreteClassA>
对象。
将Class<IFoobar>
更改为Class<? extends IFoobar>
。
对于Class对象,这种行为不是特别明智。对于集合而言,这更加合乎逻辑,从而使您停止这样做:
void method1(List<IFoobar> list)
{
list.add(new ConcreteClassA());
}
void method2()
{
List<ConcreteClassB> list = /* something */;
method1(list);
// oops! we put a ConcreteClassA inside a List<ConcreteClassB>
}