Java 如何实现从列表转换的通用方法<;T>;到T[]?
我想实现一种基于泛型的java方法,将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的类型,对于其他数字类型也是如此 编辑: 我将删除第二个问题(“是否有任何方法可以正确实现该方法?”),以获得对该代码的更多关注 解决方案
列表
转换为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
,则将代码更改为