Używam Androida Studio 1.1.0.Niezaznaczone ostrzeżenie o przypisaniu
ta nie powoduje ostrzeżenie:
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();
}
}
Ale upewnij A
Generic:
public static class A<T> {
public Map<Integer, String> getMap() {
return null;
}
}
i ten wiersz:
Map<Integer, String> map = a.getMap();
dostaje ostrzeżenie teraz: "Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>'
.
Mimo że podpis getMap
jest całkowicie niezależny od T
, a kod jest jednoznaczny w odniesieniu do typów zawartych w Map
.
wiem, że mogę pozbyć się ostrzeżenia przez reimplementing processA
następująco:
public <T> void processA(A<T> a) {
Map<Integer, String> map = a.getMap();
}
Ale dlaczego miałbym to robić? Co w ogóle ma tutaj znaczenie?
Więc pytanie brzmi - dlaczego trzeba wpisać skasowaniu nie tylko wpływa T
(co jest zrozumiałe - jeśli jestem przechodzącej wystąpienie A
, T
jest nieznany), ale również „na sztywno” rodzajowy podpis jak <Integer, String>
w tym przypadku?
'Nie może używać czegokolwiek związanego typu A , ale hej kompilator nie wie tego faktu "- cóż, to * może * poznać go dość łatwo, wystarczy rzucić okiem na implementację' processA', nietrudno sprawdzić, czy 'T' jest nieistotne;) Pójdę z '>' jak sugerujesz, ale jestem rozczarowany kompilatorem. –
@KonradMorawski W idealnym świecie, po prostu "A" powinno być nielegalne, a kod nie powinien się kompilować. Ale jest to dozwolone ze względu na kompatybilność wsteczną. Dla klasy zadeklarowanej jako "A", jej rodzaj ogólny jest niezwykle ważny, aby zrobić cokolwiek związanego z 'A'. Tak więc po prostu użycie 'A' nie powinno być dozwolone (w rzeczywistości w Scali używanie tylko' A' jest nielegalne) –
Jatin
Tak, wyobrażam sobie ... Nie używam Scala, ale pochodzę z C# strony Świat i generics języka Java czują się jak za mało butów. –