Java 如何实现从列表转换的通用方法<;T>;到T[]?

Java 如何实现从列表转换的通用方法<;T>;到T[]?,java,arrays,generics,arraylist,Java,Arrays,Generics,Arraylist,我想实现一种基于泛型的java方法,将列表转换为T[] 例如,我有一个列表,例如列表: 我遇到了一个我真的无法理解的例外: java.lang.ArrayStoreException: java.lang.String 为什么会这样 PS:上面的“NumbertTypeOfstring”方法是输入一个类似“1.11”的字符串以获得类似Double.class的类型,对于其他数字类型也是如此 编辑: 我将删除第二个问题(“是否有任何方法可以正确实现该方法?”),以获得对该代码的更多关注 解决方案

我想实现一种基于泛型的java方法,将
列表
转换为
T[]

例如,我有一个
列表
,例如
列表

我遇到了一个我真的无法理解的例外:

java.lang.ArrayStoreException: java.lang.String
为什么会这样

PS:上面的“NumbertTypeOfstring”方法是输入一个类似“1.11”的字符串以获得类似Double.class的类型,对于其他数字类型也是如此

编辑:

我将删除第二个问题(“是否有任何方法可以正确实现该方法?”),以获得对该代码的更多关注

解决方案和深度问题:

Just use List<Double> and nothing goes wrong at all.
调用此函数的结果是ArrayList,但在稍后将此arrayOfResult输入listToArray时导致上述异常。 代码如下:

    public enum caculator{
    diff, ratio;
}

public static <T> ArrayList<T> createArrayOfProgression(String firstStepLastTotal)
{
    String[] arrayOfParameter = firstStepLastTotal.replace(" ", "").split(";");
    String choice = arrayOfParameter[0];

    double first = Double.valueOf(arrayOfParameter[1]);
    double step = Double.valueOf(arrayOfParameter[2]);
    String strlast = arrayOfParameter[3];
    String strtotal = "";
    if(arrayOfParameter.length == 5)
    {
        strtotal = arrayOfParameter[4];
    }
    else
    {
        strtotal = "";
    }

    Class<?> classOfNumber = NumberTypeOfString(arrayOfParameter[2]);

    String strResult = "";
    /**
     * 1. Generate AP or OP by the total number of progression
     */
    if( !strtotal.equals("") && strlast.equals("") )
    {
        for(int i = 0; i < Integer.valueOf(strtotal); i++)
        {
            switch(caculator.valueOf(choice))
            {
            case diff:
                strResult += ( first + step * (i) )+ "\n";
                break;
            case ratio:
                strResult += ( first * java.lang.Math.pow(step, (i))) + "\n";
                break;
            }
        }
    }
    /**
     * 2. Generate AP or OP by the last item
     */
    else if( strtotal.equals("") && !strlast.equals("") )
    {
        int locationFirst = 0;
        int locationLast = (int)(Double.valueOf(strlast) -first) / (int)step + 1;
        for(int i = 0; i < locationLast - locationFirst; i++)
        {
            switch(caculator.valueOf(choice))
            {
            case diff:
                strResult += ( first + step * (i) )+ "\n";
                break;
            case ratio:
                strResult += ( first * java.lang.Math.pow(step, (i))) + "\n";
                break;
            }
        }
    }
    /**
     * 3. Generate AP or OP by the last item or by the total number of progression
     */
    else if( !strtotal.equals("") && !strlast.equals("") )
    {
        int locationFirst = 0;
        int locationLast = (int)(Double.valueOf(strlast) -first) / (int)step + 1;
        int locationTotal = Integer.valueOf(strtotal);
        for(int i = 0; i < ((locationLast - locationFirst)>locationTotal? (locationLast - locationFirst):locationTotal); i++)
        {
            switch(caculator.valueOf(choice))
            {
            case diff:
                strResult += ( first + step * (i) )+ "\n";
                break;
            case ratio:
                strResult += ( first * java.lang.Math.pow(step, (i))) + "\n";
                break;
            }
        }
    }
    else
    {
        System.out.println("Wrong!!");
    }
    System.out.println("classOfNumber="+classOfNumber);
    String[] arrayOfResult = strResult.split("\n");

    ArrayList<T> resultList = new ArrayList<T>();
    for(int i = 0; i < arrayOfResult.length; i++)
    {
        @SuppressWarnings("unchecked")
        T elem = (T) arrayOfResult[i];
        resultList.add( elem );
    }

    return resultList;
}
我不知道为什么…

改变这个:

Class<T> type = (Class<T>)NumberTypeOfString(inputList.get(0).toString());
Class type=(Class)NumberTypeOfString(inputList.get(0.toString());
为此:

Class<T> type = (Class<T>)(inputList.get(0).getClass());
Class type=(Class)(inputList.get(0.getClass());
Array.newInstance
doc的

componentType—表示组件类型的类对象 新阵列

因此,新数组的类型需要是
列表中元素的类型

更改此项:

Class<T> type = (Class<T>)NumberTypeOfString(inputList.get(0).toString());
Class type=(Class)NumberTypeOfString(inputList.get(0.toString());
为此:

Class<T> type = (Class<T>)(inputList.get(0).getClass());
Class type=(Class)(inputList.get(0.getClass());
Array.newInstance
doc的

componentType—表示组件类型的类对象 新阵列

因此,新数组的类型需要是
列表中元素的类型

更改此项:

Class<T> type = (Class<T>)NumberTypeOfString(inputList.get(0).toString());
Class type=(Class)NumberTypeOfString(inputList.get(0.toString());
为此:

Class<T> type = (Class<T>)(inputList.get(0).getClass());
Class type=(Class)(inputList.get(0.getClass());
Array.newInstance
doc的

componentType—表示组件类型的类对象 新阵列

因此,新数组的类型需要是
列表中元素的类型

更改此项:

Class<T> type = (Class<T>)NumberTypeOfString(inputList.get(0).toString());
Class type=(Class)NumberTypeOfString(inputList.get(0.toString());
为此:

Class<T> type = (Class<T>)(inputList.get(0).getClass());
Class type=(Class)(inputList.get(0.getClass());
Array.newInstance
doc的

componentType—表示组件类型的类对象 新阵列

因此,新数组的类型必须是
列表中元素的类型。asList()返回一个扩展AbstractList而不是ArrayList的ArrayList
因此,您的异常
java.lang.ClassCastException:[Ljava.lang.String;无法转换为[Ljava.lang.Double

因此,如果您使用
java.util.ArrayList
作为基本类型,而不是
java.util.List
,请将代码更改为下面的代码

public class G {

public static <T> T[] listToArray(ArrayList<T> inputList)
{
    @SuppressWarnings("unchecked")
    Class<T> type = (Class<T>)inputList.get(0).getClass();
    @SuppressWarnings("unchecked")
    T[] resultArray = (T[]) Array.newInstance(type, inputList.size());

    for(int i=0; i < inputList.size(); i++)
    {
        resultArray[i] = (T)inputList.get(i);
    }
    return resultArray;
}

public static void main( String[] args ) {
    ArrayList<Double> lst = new ArrayList( Arrays.asList( new Double[]{1.11, 2.22, 3.33} ) );
    Double[] d = listToArray( lst );
    System.out.println(d[0]);
}
公共类G{
公共静态T[]listToArray(ArrayList inputList)
{
@抑制警告(“未选中”)
类类型=(类)inputList.get(0.getClass();
@抑制警告(“未选中”)
T[]resultArray=(T[])数组.newInstance(类型,inputList.size());
对于(int i=0;i
}

Arrays.asList()返回扩展AbstractList而不是ArrayList的ArrayList!

因此,您的异常
java.lang.ClassCastException:[Ljava.lang.String;无法转换为[Ljava.lang.Double

因此,如果您使用
java.util.ArrayList
作为基本类型,而不是
java.util.List
,请将代码更改为下面的代码

public class G {

public static <T> T[] listToArray(ArrayList<T> inputList)
{
    @SuppressWarnings("unchecked")
    Class<T> type = (Class<T>)inputList.get(0).getClass();
    @SuppressWarnings("unchecked")
    T[] resultArray = (T[]) Array.newInstance(type, inputList.size());

    for(int i=0; i < inputList.size(); i++)
    {
        resultArray[i] = (T)inputList.get(i);
    }
    return resultArray;
}

public static void main( String[] args ) {
    ArrayList<Double> lst = new ArrayList( Arrays.asList( new Double[]{1.11, 2.22, 3.33} ) );
    Double[] d = listToArray( lst );
    System.out.println(d[0]);
}
公共类G{
公共静态T[]listToArray(ArrayList inputList)
{
@抑制警告(“未选中”)
类类型=(类)inputList.get(0.getClass();
@抑制警告(“未选中”)
T[]resultArray=(T[])数组.newInstance(类型,inputList.size());
对于(int i=0;i
}

Arrays.asList()返回扩展AbstractList而不是ArrayList的ArrayList!

因此,您的异常
java.lang.ClassCastException:[Ljava.lang.String;无法转换为[Ljava.lang.Double

因此,如果您使用
java.util.ArrayList
作为基本类型,而不是
java.util.List
,请将代码更改为下面的代码

public class G {

public static <T> T[] listToArray(ArrayList<T> inputList)
{
    @SuppressWarnings("unchecked")
    Class<T> type = (Class<T>)inputList.get(0).getClass();
    @SuppressWarnings("unchecked")
    T[] resultArray = (T[]) Array.newInstance(type, inputList.size());

    for(int i=0; i < inputList.size(); i++)
    {
        resultArray[i] = (T)inputList.get(i);
    }
    return resultArray;
}

public static void main( String[] args ) {
    ArrayList<Double> lst = new ArrayList( Arrays.asList( new Double[]{1.11, 2.22, 3.33} ) );
    Double[] d = listToArray( lst );
    System.out.println(d[0]);
}
公共类G{
公共静态T[]listToArray(ArrayList inputList)
{
@抑制警告(“未选中”)
类类型=(类)inputList.get(0.getClass();
@抑制警告(“未选中”)
T[]resultArray=(T[])数组.newInstance(类型,inputList.size());
对于(int i=0;i
}

Arrays.asList()返回扩展AbstractList而不是ArrayList的ArrayList!

因此,您的异常
java.lang.ClassCastException:[Ljava.lang.String;无法转换为[Ljava.lang.Double

因此,如果您使用
java.util.ArrayList
作为基本类型,而不是
java.util.List
,则将代码更改为