7

我有一堂课如下:

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);

也就是说,Tin convert 本身可能是一个通用实例,我发现要实现这个目标,我必须传递一个完全类型化的虚拟对象,因为如果我使用ArrayList.class它,它不会给 java 编译器足够的信息而不是.ArrayList<Integer>Class<T> dummyclsT dummy

我错过了什么吗?有没有办法在不需要假人的情况下编写和调用转换?

4

3 回答 3

10

在调用时指定类型,而不是让 java 推断类型:

Integer elem = MyConverter.<ArrayList<Integer>>convert(ar, "java.util.ArrayList<Integer>");

这个链接描述了这个(很酷的)语法。

于 2012-06-26T17:26:31.157 回答
5

这种看起来像 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;
}
于 2012-06-26T17:20:12.277 回答
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;
        }
    }
于 2019-07-11T07:12:16.677 回答