使用java.lang.Class作为方法参数的问题

时间:2014-03-12 10:59:27

标签: java

我有以下类/接口设置。

  • 接口IFoobar
  • 实现IFoobar并且是抽象的Class BaseClass
  • 类ConcreteClassA,它扩展了BaseClass
  • 扩展BaseClass的类ConcreteClassB
  • 类ConcreteClassC,它扩展了BaseClass

我有一个方法,我需要为上面的具体类传递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来做事情,所以我猜我错过了一些简单的事情。我希望类型化的类声明像普通参数一样工作,因为具体类被识别为接口的实例,但显然情况并非如此。

我尝试过各种各样的强制转换方法,但要么没有得到预期的结果,要么代码无效。因此,任何关于我需要做什么的想法都会受到赞赏。

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Class<IFoobar>唯一可接受的值是IFooBar.class。如果您想接受IFooBar.class及其所有子类,则应使用Class<? extends IFooBar>

答案 2 :(得分:0)

错误与&#34; Class&#34;

无关

只需使用

即可
ArrayList<Object> x = new ArrayList<String>();

您收到错误:不兼容的类型

因为尽管String类是Object的子类,但是ArrayList&lt; Object&gt;是与ArrayList&lt; String&gt;不同的类型。这就是泛型的本质。

您可以使用

void doSomething(String id, Class c)