【问题标题】:How to pass multiple type of ArrayList to a function in Java?如何将多种类型的 ArrayList 传递给 Java 中的函数?
【发布时间】:2019-03-04 07:33:28
【问题描述】:

我有多个不同类型的 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传递给单个函数,并在函数中获取正确的类型?

【问题讨论】:

  • 为什么不完全删除tag,只使用相应类型的2个方法?
  • 正如@Lino 所说,还请注意您写了“ArrayList> list”这是一个通配符符号,只接受所有类型的 ArrayList 泛型,这是您需要的吗?

标签: java generics 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&lt;String&gt;,它将被用作List&lt;String&gt;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() +"]");
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2020-07-17
    • 2011-02-20
    • 2014-11-17
    • 2019-04-23
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多