Я использую Android Studio 1.1.0.
Это не вызывает никаких предупреждений:
public static class A {
public Map<Integer, String> getMap() {
return null;
}
}
public static class B {
public void processA(A a) {
Map<Integer, String> map = a.getMap();
}
}
Но сделайте A generic:
public static class A<T> {
public Map<Integer, String> getMap() {
return null;
}
}
И эта строка:
Map<Integer, String> map = a.getMap();
теперь вы получаете предупреждение: "Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>'.
Несмотря на то, что подпись getMap полностью не зависит от T, и код недвусмыслен относительно типов, которые содержит Map.
Я знаю, что я могу избавиться от предупреждения, переопределив processA следующим образом:
public <T> void processA(A<T> a) {
Map<Integer, String> map = a.getMap();
}
Но зачем мне это делать? Что T имеет здесь вообще?
Итак, вопрос в том, почему стирание типа должно не только влиять на T (что понятно - если я передаю экземпляр A, T неизвестен), но и "жестко закодированная" общая подпись типа <Integer, String> в этом случае?