Я читал о varargs heap загрязнения, и я действительно не понимаю, как varargs или невосстанавливаемые типы будут отвечать за проблемы, которые еще не существуют без типичности, Действительно, я могу легко заменить
public static void faultyMethod(List<String>... l) {
Object[] objectArray = l; // Valid
objectArray[0] = Arrays.asList(42);
String s = l[0].get(0); // ClassCastException thrown here
}
с
public static void faultyMethod(String... l) {
Object[] objectArray = l; // Valid
objectArray[0] = 42; // ArrayStoreException thrown here
String s = l[0];
}
Второй просто использует ковариацию массивов, что действительно является проблемой здесь. (Даже если List<String>
был reifiable, я думаю, он все равно будет подклассом Object
, и я все равно мог бы назначить какой-либо объект для массива.) Конечно, я вижу там небольшую разницу между ними, но этот код неисправен, использует ли он дженерики или нет.
Что они подразумевают под загрязнением кучи (это заставляет меня задуматься об использовании памяти, но единственная проблема, о которой они говорят, это потенциальная небезопасность типа) и как она отличается от любого нарушения типа с использованием ковариации массивов?