使用作为参数传递的类来实例化泛型类型

时间:2012-12-12 15:13:14

标签: java spring generics

我对仿制药没有那么多经验,我遇到了问题。 我有两个类,两个泛型类型,我必须实例化传递相同的类,所以我试图做这样的事情:

protected MyNotGenericClass(Class<CommonType> myClass) {
    g1= new GenericType1<myClass>();
    g2 = new GenericType2<myClass>();
}

并将CommonType类传递给构造函数:

new NotAGenericClass(CommonType.class);

但由于'myClass' cannot be resolved to a type而无效。

我做错了什么?

更新

请注意,NotAGenericClass不是泛型类型对我很重要,因为我必须使用Spring实例化它,我可能会遇到一些困难。

4 个答案:

答案 0 :(得分:1)

尝试使您的类具有通用性,如下所示:

public class MyClass<T extends CommonType> {

    private GenericType1<T> g1 = new GenericType1<T>();
    private GenericType2<T> g2 = new GenericType2<T>();

    // no constructor needed

}

答案 1 :(得分:0)

类型参数只能是类型(参考类型i。,类型或接口类型),而不能是参考变量

您的代码与以下代码相同:

            String s="12";
        List<s>  list = new ArrayList<s>();

上面的代码是非法的,因为Type Parameters应该是实际的Type(引用类型),这里s是引用变量但不是类型。 这同样适用于您的代码。

修改

如果您希望构造函数是通用的,请执行以下操作:

protected <T> Constructor(T myClass) {
    g1= new GenericType1<T>();
    g2 = new GenericType2<T>();
}

您的电话将是:

new Constructor(new CommonType());
new Constructor(new AnotherCommonType());

答案 2 :(得分:0)

您需要将参数类型冒泡到另一个类:

class Foo<T> {
  private Bar1<T> g1;
  private Bar2<T> g2;
  protected Foo(Class<T> clazz) {
    g1 = new Bar1<T>();
    g2 = new Bar2<T>();
  }
}

请注意,甚至传递clazz参数的唯一原因是您需要在运行时执行一些面向反射的操作。

答案 3 :(得分:0)

你不能在泛型中使用myClass,它是一个不是类的变量。

如何使用泛型的示例:

public class GenericExample<T> {
        private T genericObject;

        public GenericExample(T genericObject){
            this.genericObject = genericObject;
        }

        public T getGenericObject(){
            return genericObject;
        }

    public static void main(String[] args){
        GenericExample<String> gen1 = new GenericExample<String>("This is a String");
        GenericExample<Integer> gen2 = new GenericExample<Integer>(1);

        String format = "value : %s, %s";
        System.out.println(String.format(format, gen1.getGenericObject(), gen1.getGenericObject().getClass()));
        System.out.println(String.format(format, gen2.getGenericObject(), gen2.getGenericObject().getClass()));
    }
}

输出:

value:这是一个String,类java.lang.String

value:1,类java.lang.Integer