我有一个功能:
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
答案 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
是什么。