В чем разница между List
, List<?>
, List<T>
, List<E>
и List<Object>
?
Теперь я не слепо задаю этот вопрос, поэтому, пожалуйста, не закрывайте эту тему. Позвольте мне сначала ввести базовый код:
private static List<String> names = new ArrayList<String>();
static {
names.add("Tom");
names.add("Peter");
names.add("Michael");
names.add("Johnson");
names.add("Vlissides");
}
public static void test(List<String> set){
System.out.println(set);
}
public static void main(String args[]){
test(names);
}
Я понимаю, что:
1. List
: это необработанный тип, поэтому не typesafe
. Это приведет к генерации ошибки во время выполнения, когда кастинг будет плохим. Мы хотим, чтобы ошибка времени компиляции была неудачной. Не рекомендуется использовать.
2. List<?>
: - неограниченный подстановочный знак. Но не уверен, для чего это? Поэтому, если я изменил метод test
на
public static void test(List<?> set){
System.out.println(set);
}
он все еще работает хорошо. Если вы можете объяснить использование этого, я был бы очень признателен.
EDIT: если я это сделаю:
public static void test(List<?> set){
set.add(new Long(2)); //--> Error
set.add("2"); //--> Error
System.out.println(set);
}
но если я изменю test
на это:
public static void test(List<String> set){
set.add(new Long(2)); //--> Error
set.add("2"); //--> Work
System.out.println(set);
}
3. List<T>
:
public static void test(List<T> set){ //T cannot be resolved
System.out.println(set);
}
Я думаю, я не понимаю этот синтаксис. Я видел что-то вроде этого, и он работает:
public <T> T[] toArray(T[] a){
return a;
}
Пожалуйста, объясните это мне, пожалуйста? Иногда я вижу <T>
, или <E>
, или <U>
, <T,E>
. Все они одинаковые или они представляют что-то другое?
4. List<Object>
public static void test(List<Object> set){
System.out.println(set);
}
Затем я получил ошибку The method test(List<Object>) is not application for the argument List<String>
для приведенного ниже кода. Я запутался. Я думал, что String
является подмножеством Object
?
public static void main(String args[]){
test(names);
}
EDIT: Если я попробую это
test((List<Object>)names);
то я получил Cannot cast from List<String> to List<Object>