Я использую 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>
в этом случае?