Спеку не ковырял на предмет объяснения, почему происходит именно так, а не иначе, но само знание о таком моменте может пригодиться.
В следующем примере (1) компилится (с последующим ArrayStoreException в рантайм), (2) не компилится:
public class BBB {
public static void main(String[] args) throws Exception {
String[] array = new String[1];
store(array, 1); // (1)
Collection<String> collection = new ArrayList<String>();
store(collection, 2); // (2)
}
private static <T> void store(T[] array, T element) {
array[0] = element;
}
private static <T> void store(Collection<T> collection, T element) {
collection.add(element);
}
}
Лечится:
вариант 1
public class BBB {
public static void main(String[] args) throws Exception {
String[] array = new String[1];
BBB.<String>store(array, 1);
}
private static <T> void store(T[] array, T element) {
array[0] = element;
}
}
вариант 2
public class BBB {
public static void main(String[] args) throws Exception {
String[] array = new String[1];
store(array, 1);
}
private static <T, S extends T> void store(T[] array, S element) {
array[0] = element;
}
}