Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复杂的静态泛型方法,其泛型返回类型本身可能是泛型_Java_Generics - Fatal编程技术网

Java 复杂的静态泛型方法,其泛型返回类型本身可能是泛型

Java 复杂的静态泛型方法,其泛型返回类型本身可能是泛型,java,generics,Java,Generics,我的课程如下: 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 simil

我的课程如下:

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
    }
}
公共类MyConverter{
公共T转换(对象o、字符串类型标识符、T伪)
{
…执行一些转换,例如将java数组转换为ArrayList,反之亦然
…基于与Class.getName()类似的typeidentifier语法,但
…嵌入有关泛型子类型的信息
}
}
希望能够做一些一般性的事情,比如:

int[] ar = {...};
ArrayList<Integer> dummy = null;
Integer elem = MyConverter.convert(ar, "java.util.ArrayList<Integer>", dummy)
                  .get(15);
int[]ar={…};
ArrayList dummy=null;
整数elem=MyConverter.convert(ar,“java.util.ArrayList”,dummy)
.get(15);
也就是说,convert中的
T
本身可能是一个通用实例,我发现为了实现这个目标,我必须传递一个完全类型的伪码,因为
ArrayList.class
不会给java编译器足够的信息,如果我使用
类dummycls
而不是
T伪码,那么它就是
ArrayList


我错过什么了吗?有没有一种方法可以在不需要伪数组的情况下写入和调用convert?

这种类型看起来像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;
}
公共静态列表asList(T…a){
ArrayList arr=新的ArrayList();
对于(T项:a){
arr.add(项目);
}
返回arr;
}

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

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

Integer elem=MyConverter。描述这种(很酷的)语法。

您可以在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;
        }
    }
公共类MyConverter{
公共静态void main(字符串[]args){
整数i=MyConverter.convert();
系统输出打印LN(i);
}
@抑制警告(“未选中”)
私有静态T convert(){
整数i=新整数(10);
返回(T)i;
}
}

您想实现什么目标?它似乎太复杂了。您想为类似于
ArrayList.class
的内容创建一个应用程序吗?您可以使用强制转换:
(类)(对象)ArrayList.Class
。不过,它看起来也不太优雅。我同意,Arrays.asList方法看起来像您想要使用的方法。我在转换函数中做的不仅仅是ArrayList转换。还有HashMap转换和其他复杂的事情。我需要其他更一般的答案。这正是我想要的。甲骨文网站上的文档记录在哪里?我添加了一个描述它的链接。仅供参考,我在使用Eclipse内联一个结果变量时偶然发现了这种鲜为人知的语法(这样就消除了java推断类型的机会),Eclipse使用这种语法插入了类型。不用说,我发现了仿制药的黄金,并且从那以后经常使用它。这比仅仅为了锁定类型而传入类要好得多。