Когда вы хотите передать различные типы объектов, которые вы используете 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() +"]");
}
Реальная функциональность, которую вы хотите получить в своем методе, не совсем ясна, поэтому это может быть не то, что вам нужно.В этом случае уточните, что должен делать ваш метод, и мы продолжим.