我有以下类/接口的设置。


接口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>
}

09-11 18:14