问题描述
我有一个不同类型的多个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传递给单个函数并在函数中获取正确的类型?
1楼
 
     当您要传递不同类型的对象时,可以使用Generics ,但是根据您打算执行的操作,最好对每种类型使用单独的方法。 
 
     但是,您在这里遇到的是Java Generics编译时的类型擦除,因此您不再知道要传递哪种类型的列表。 
 
     您的方法应使用如下的强制转换来实现,但是它不是类型安全的。 
 
     意味着您可以使用错误的列表传递错误的标签。 
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() +"]");
   }
}
 
   
     最好使用以下方法来确保类型安全。 
 
     这意味着,如果您传递List<String> ,它将用作List<String> ,并且get方法将自动返回String对象。 
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() +"]");
}
 
  您希望在方法中获得的实际功能并不十分清楚,因此可能不是您所需要的。 在这种情况下,请详细说明您的方法应该完成什么,然后我们将继续。