Ich baute etwas, das ich nicht wirklich verstehe - ich weiß nicht, wie es funktioniert. Ich habe mich mit dieser multicatch explaination article vertraut gemacht.Ermitteln der Kompilierungszeit Multicatch-Ausnahmetyp
Betrachten Sie diese zwei Ausnahmen und Code:
public class MyException1 extends Exception {
// constructors, etc
String getCustomValue();
}
public class MyException2 extends Exception {
// constructors, etc
String getCustomValue() { return "foo"; }
}
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // won't work, as I expected
}
ich nicht in der Lage sein getCustomValue()
zu nennen, auch wenn das Verfahren ist das gleiche, weil innerhalb Java die oben try/catch
soll, um tatsächlich die MyException1/2
werden Gießen zu Exception
(so habe ich die Dokumente verstanden).
Wenn ich jedoch eine Schnittstelle wie folgt vorstellen:
public interface CustomValueGetter {
String getCustomValue();
}
public class MyException1 extends Exception implements CustomValueGetter /*...*/
public class MyException2 extends Exception implements CustomValueGetter /*...*/
und fügen Sie ihn auf beide Ausnahmen, Java ist tatsächlich in der Lage, mir zu erlauben, dass die Methode zu verwenden. Und dann ruft dies gilt:
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // does work
}
Kurz gesagt, meine Frage ist: was tatsächlich geschieht hier: (MyException1|MyException2 e)
.
Was ist e
?
ist die nächste übergeordnete Klasse als Typ der
e
gewählt? This question asks about it und das ist angeblich die Antwort. Wenn ja, warum ist dann die Schnittstelle CustomValueGetter "sichtbar" wenn ich auf e zugreife? Es sollte nicht sein, wenn in meinem Falle
einException
ist.Und wenn nicht, wenn die echte Klasse entweder
MyException1
oderMyException2
ist, warum kann ich nicht einfach die gleiche Methode für diese beiden Klassen aufrufen?Ist
e
eine Instanz einer dynamisch generierten Klasse, die alle gemeinsamen Schnittstellen der beiden Ausnahmen implementiert und vom nächstliegenden Typ ist?
Wenn die angenommene Antwort des Links in Ihrer Antwort richtig ist, dann sollte die Schnittstelle, die ich verwendete, niemals in 'e' aufgelöst werden, weil die Oberklasse dieser beiden Ausnahmen es nicht implementiert. – Dariusz
@Dariusz ich edid und zitiert den Link in der Antwort auf die andere Frage, Benachrichtigen Sie den späteren Teil sagen: 'Ein Iub kann eine Kreuzung Typ einer Oberklasse und eine oder mehrere Schnittstellen sein. – SomeJavaGuy
Schade, dass die Formulierung nicht gemacht es in die eigentliche Java-Sprache Dokumentation (die sehr dunkel geschrieben ist). Ich denke, das ist die Beschreibung von [Intersection Types] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.9), die "Typ-Inferenz (§15.12.2.7) ", und ebenso die Beschreibung der [Fangklausel] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510). – Andreas