Сначала некоторый код (Java 7), созданный только для иллюстрации моих вопросов.
import java.util.*;
class Generics101 {
public static void addTrue(List list) {
list.add(true);
}
public static void main(String[] args) {
List<Integer> testList = new ArrayList<>();
addTrue(testList);
System.out.println(testList.get(0));
// testList.add(true); // will not compile when uncommented
}
}
У меня есть следующие два вопроса:
В методе
addTrue
Eclipse намекает, что ему не нравитсяraw types
. Когда я пытаюсь изменить параметры метода, чтобы использовать подстановочный знакList<?> list
, он не будет компилироваться. Я просмотрел учебник по универсальным технологиям, но не смог найти ответ. Что мне здесь не хватает и где мне об этом прочитать?В том же руководстве говорится, что "универсальные методы были введены в язык Java, чтобы обеспечить более тщательную проверку типов во время компиляции..." Я понимаю, что из-за
type erasure
такое принудительное выполнение не может произойти во время выполнения, поэтому мой вышеприведенный код компилируется и запускается. Это вызовет ошибку компиляции, если закомментированная строка будет раскомментирована, поэтому я предполагаю, чтоtighter type checks
действуют в рамках одного и того же метода. Какова точная сфера применения такого правоприменения? Как это формально определяется?
addTrue
должен работать только дляList<Boolean>
. - person Louis Wasserman   schedule 24.10.2013