import java.util.Arrays;
import java.util.List;
public class Pair<T> {
private final T first;
private final T second;
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public List<String> toArray() {
return Arrays.asList(
String.valueOf(this.first),
String.valueOf(this.second));
}
public static void main(String[] args) {
Pair pair = new Pair<Object>(23, "skidoo");
for (String str : pair.toArray()) {
System.out.println(str);
}
}
}
Удивлены? Я тоже. Она просто не скомпилируется. Несовместимость типов в строке:
for (String str : pair.toArray()) {
Что происходит? Ведь метод
toArray
всегда возвращает список строк! Проблема в том, что локальная переменная pair
использует raw type. А это означает, что все поля и методы тоже будут использовать raw types. Т.е. метод toArray
в таком случае возвращает просто список List
. Бороться с этим просто. Измените декларацию переменно таким образом:Pair<Object> pair = new Pair<Object>(23, "skidoo");
или ещё более просто:
Pair<?> pair = new Pair<Object>(23, "skidoo");
И запомните, что тип
List
(raw type) отличается от List<Object>
(parametrized type).А для меня, как разработчика пакета JavaBeans, который в полный рост использует reflection, это знание ОЧЕНЬ важно. Я вышел на новый уровень понимания generics!