我有以下类/接口设置。
我有一个方法,我需要为上面的具体类传递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来做事情,所以我猜我错过了一些简单的事情。我希望类型化的类声明像普通参数一样工作,因为具体类被识别为接口的实例,但显然情况并非如此。
我尝试过各种各样的强制转换方法,但要么没有得到预期的结果,要么代码无效。因此,任何关于我需要做什么的想法都会受到赞赏。
提前致谢。
答案 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)