Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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中将多种类型的ArrayList传递给函数?_Java_Generics_Arraylist - Fatal编程技术网

如何在Java中将多种类型的ArrayList传递给函数?

如何在Java中将多种类型的ArrayList传递给函数?,java,generics,arraylist,Java,Generics,Arraylist,我有多个不同类型的ArrayList,如何将它们传递给单个函数 比如说, ArrayList<String> mStringList = new ArrayList<>(); ArrayList<Interge> mIntList = new ArrayList<>(); passArraylist(0,mStringList) passArraylist(1,mIntList ) private void passArraylist(int

我有多个不同类型的ArrayList,如何将它们传递给单个函数

比如说,

ArrayList<String> mStringList = new ArrayList<>();
ArrayList<Interge> mIntList = new ArrayList<>();

passArraylist(0,mStringList)
passArraylist(1,mIntList )

private void passArraylist(int tag , ArrayList<?> list){
   if(tag == 0){
       //how to change list to ArrayList<String>
   }else if(tag == 1){
       //how to change list to ArrayList<Interge>
   }
}
ArrayList mStringList=new ArrayList();
ArrayList mIntList=新的ArrayList();
passArraylist(0,mStringList)
passArraylist(1,mIntList)
私有void passArraylist(int标记,ArrayList列表){
如果(标记==0){
//如何将列表更改为ArrayList
}else if(标记==1){
//如何将列表更改为ArrayList
}
}

如何将不同类型的ArrayList传递给单个函数并获得正确的函数类型?

当您想要传递不同类型的对象时,您可以使用
泛型,但根据您打算执行的操作,最好对每种类型使用不同的方法。
然而,您在这里遇到的障碍是编译时对
Java泛型的类型擦除,因此您不再知道传递的是什么类型的列表

您的方法应该使用如下所示的强制转换来实现,但是它不是类型安全的。
这意味着你可以用错误的列表传递错误的标签

public static void main(String[] args) {     
    List<String> mStringList = new ArrayList<String>();
    List<Integer> mIntList = new ArrayList<Integer>();

    // Your method, but type safety is lost.
    passArraylist(0, mStringList);
    passArraylist(1, mIntList);

    passArraylist(0, mIntList);       -> compiles, but will cause a RuntimeException
}

private void passArraylist(int tag, List<?> list){
    if(tag == 0){
       List<String> stringList = (List<String>) list;
       String item = stringList.get(0);
       System.out.println("with value ["+ item +"] and type ["+ item.getClass() +"]");
   }else if(tag == 1){
       List<Integer> intList = (List<Integer>) list;
       Integer item = intList.get(0);
       System.out.println("with value ["+ item +"] and type ["+ item.getClass() +"]");
   }
}

您希望在方法中获得的实际功能并不完全清楚,因此这可能不是您所需要的。在这种情况下,请详细说明您的方法应该完成什么,我们将从那里继续。

为什么不完全删除
标记
,只创建两个具有相应类型的方法?正如@Lino所说,还请注意您编写的“ArrayList list”这是一个通配符符号,只接受所有类型的ArrayList generic,这是您需要的吗?
public static void main(String[] args) {     
    List<String> mStringList = new ArrayList<String>();
    List<Integer> mIntList = new ArrayList<Integer>();

    // New method, with type safety.
    passArraylist(mStringList, String.class);
    passArraylist(mIntList, Integer.class);

    passArraylist(mIntList, String.class);       -> won't compile
}

private <T> void passArraylist(List<T> list, Class<T> clazz){
   if(clazz == String.class){
       System.out.print("Print my String ");
   }else if(clazz == Integer.class){
       System.out.print("Print my Integer ");
   }
   T item = list.get(0);
   System.out.println("with value ["+ item +"] and type ["+ item.getClass() +"]");
}