获取通用数组类

时间:2012-08-07 14:08:59

标签: java arrays generics

我有一个功能:

add(Collection<?> many)

我称之为:

Collection<NewClass> awa = new ArrayList<NewClass>();
add(awa)

如何获得<?>类型?在那个功能?

many.getClass()提供ArrayList

为什么我需要这个?尝试创建一个通用的DAO方法来添加< ? >的集合。

修改

尝试这样:

public static void add(Collection<?> many)  {
    Type typeArg = ((ParameterizedType)Testing.class.getGenericSuperclass()).getActualTypeArguments()[0];
    System.out.println(typeArg);
}

    Collection<NewClass> awa = new ArrayList<NewClass>();


    add(awa);

得到错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

4 个答案:

答案 0 :(得分:4)

many.getClass()给出ArrayList

当然,这听起来不对。

如果您执行many.get(0).getClass()该怎么办?在这里,我们要询问元素,而不是容器,如果这是有意义的话。我是C#er,所以这可能不是100%正确的方法,但这是我在C#中采用的路线。

答案 1 :(得分:1)

您可以绕过此问题并使您的方法具有通用性,例如:

public <T> void add(Collection<T> blah){}

你可以通过

来调用它
this.<NewClass>add(awa);

如果它在另一个班级,那么

DifferentClass dc = new DifferentClass();
dc.<NewClass>add(awa);

答案 2 :(得分:1)

为什么不尝试这样的事情:

public class Test {

  Test() {
    Collection<Integer> ints = new ArrayList<Integer>();
    add(ints, Integer.class);
    Collection<String> strings = new ArrayList<String>();
    add(strings, String.class);
  }

  public final <T> void add(Collection<T> many, Class<T> type) {
    System.out.println(type.getName());
    // do whatever needed.
  }

}

答案 3 :(得分:1)

您可以在运行时检查实际类型参数,但是您只能通过字段,方法,构造函数等的反射API来读取它。示例如下:

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;


public class TypesSample {

    public List<String> sampleList;


    public static void main(String[] args) throws Exception {
        Field f = TypesSample.class.getField("sampleList");
        ParameterizedType paramType = (ParameterizedType)f.getGenericType();
        Type typeArgument = paramType.getActualTypeArguments()[0];
        System.out.println(paramType.toString() + " with argument : " + typeArgument.toString());
    }


}

它说:java.util.List<java.lang.String> with argument : class java.lang.String

由于类型擦除,您不会从对象引用中获取实际参数类型。

//编辑:

这是你可以为你的情况做的事情:

abstract class GenericDAO<T> {

    public void add(Collection<T> many) {
        Type typeArg = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        System.out.println("This is a DAO for " + typeArg);
    }

}

    // create DAOs that define what type parameter is   
class IntegerDAO extends GenericDAO<Integer> {}
class StringDAO extends GenericDAO<String> {}

然后:

GenericDAO<Integer> integerDAO = new IntegerDAO();
integerDAO.add(Arrays.asList(1,2,3));
GenericDAO<String> stringDAO = new StringDAO();
stringDAO.add(Arrays.asList("A","B","C"));

表示:     这是类java.lang.Integer的DAO     这是类java.lang.String

的DAO

但是你需要通过扩展泛型类来明确声明T是什么。