1

我对泛型没有那么丰富的经验,我有一个问题。我有两个类,两个泛型类型,我必须实例化传递同一个类,所以我试图做这样的事情:

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

4 回答 4

1

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

public class MyClass<T extends CommonType> {

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

    // no constructor needed

}

于 2012-12-12T16:11:26.873 回答
0

类型参数只能是类型(引用类型 i.、类类型或接口类型),不能是引用变量

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

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

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

编辑:

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

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

你的电话是:

new Constructor(new CommonType());
new Constructor(new AnotherCommonType());
于 2012-12-12T15:17:07.927 回答
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参数的唯一原因是您是否需要在运行时执行一些面向反射的操作。

于 2012-12-12T15:42:19.197 回答
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 : 这是一个字符串,类 java.lang.String

值:1,类 java.lang.Integer

于 2012-12-12T15:50:59.470 回答