Как передать несколько типов ArrayList для функции в Java? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть несколько 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 Ответ

0 голосов
/ 04 марта 2019

Когда вы хотите передать различные типы объектов, которые вы используете 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() +"]");
}

Реальная функциональность, которую вы хотите получить в своем методе, не совсем ясна, поэтому это может быть не то, что вам нужно.В этом случае уточните, что должен делать ваш метод, и мы продолжим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...