我有一个课程如下:
public class MyConverter {
public <T> T convert (Object o, String typeidentifier, T dummy)
{
... do some conversions such as a java array to an ArrayList or vice versa
... based on a typeidentifier syntax similar to Class.getName() but which
... embeds information about generic subtypes
}
}
并且希望能够像这样做一般的事情:
int[] ar = {...};
ArrayList<Integer> dummy = null;
Integer elem = MyConverter.convert(ar, "java.util.ArrayList<Integer>", dummy)
.get(15);
也就是说,转换中的T
本身可能是一个通用实例,我发现要使这个目标起作用,我必须传递一个完全类型的虚拟对象,因为ArrayList.class
不会如果我使用ArrayList<Integer>
而不是Class<T> dummycls
,请为java编译器提供足够的信息T dummy
。
我错过了什么吗?有没有办法在不需要虚拟的情况下编写和调用转换?
答案 0 :(得分:10)
指定通话类型,而不是让java推断出类型:
Integer elem = MyConverter.<ArrayList<Integer>>convert(ar, "java.util.ArrayList<Integer>");
This link描述了这种(酷)语法。
答案 1 :(得分:4)
这种看起来像Arrays.asList,它将采用原生数组并将其转换为ArrayList。
实施可能如下:
public static <T> List<T> asList(T... a) {
ArrayList<T> arr = new ArrayList<T>();
for (T item: a) {
arr.add(item);
}
return arr;
}
答案 2 :(得分:0)
您可以在convert方法中编写要转换的任何逻辑,并将其转换为通用类型并返回。
public class MyConverter {
public static void main(String[] args) {
Integer i = MyConverter.convert();
System.out.println(i);
}
@SuppressWarnings("unchecked")
private static <T> T convert() {
Integer i = new Integer(10);
return (T)i;
}
}