如何使用泛型类的类型对象作为参数? - 泛型和反思相结合

时间:2011-01-22 01:17:33

标签: java generics reflection parameters constructor

我有两个班级:

public abstract class MyAbstractSuperClass<A, B> {

    public MyAbstractSuperClass(Class<A> a, Class<B> b) {
        ...
    }

    ...
}

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass<A>> {

    public MyClass(Class<A> a) {
    super(a, MyOtherClass.class));
            ...
    }

    ...
}

现在你看,子类必须调用超类的构造函数。在那一行,我得到以下错误:

The constructor MySuperClass<A, MyOtherClass<A>>(Class<A>, Class<MyOtherClass>) is undefined
  • 那么如何获得Class<MyOtherClass<A>>类型的对象?
  • 如何在超级构造函数调用中执行此操作,我无法执行多少操作?

提前致谢。

3 个答案:

答案 0 :(得分:1)

构造函数需要Class<MyOtherClass<A>>,而不是Class<MyOtherClass>。我认为满足编译器的唯一方法是通过一系列难看的演员:

@SuppressWarnings("unchecked") 
public MyClass(Class<A> a) {
   super(a, (Class<MyOtherClass<A>>)(Class<?>)MyOtherClass.class);
}

通过检查可以看到类型安全,因为原始类型MyOtherClass的类文字与参数化MyOtherClass<A>的类文字相同。但这并不能阻止生成未经检查的警告,可以按上述方式进行抑制,也可以忽略。

答案 1 :(得分:0)

删除MyOtherClass定义中MyClass的类型参数。你显然对MyClass'身体的任何地方都不感兴趣。

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass> {
    public MyClass(Class<A> a) {
       super(a, MyOtherClass.class);
    }
}

如果警告困扰您,请添加@SuppressWarnings("rawtypes")

答案 2 :(得分:-1)

您必须向MyClass构造函数添加第二个参数:

public MyClass(Class<A> a, Class<MyOtherClass<A>> bClass) {
    super(a, bclass));
}

@Bert F:从某种意义上讲,这确实是“推卸责任”,但它将责任推卸给能够提供相应类型的类文字的人。调用者知道类型变量A的实际值,因此可以提供正确类型的类文字。由于删除,MyClass无法做到这一点。