2015-09-03 2 views
7

zu verstehen, während auf Referenzart Gießen in Java SE-Spezifikation Lese:Schwieriger Zustand auf Java Specification

einen Compiler-Referenztyp S (Quelle) und einen Compiler- Referenztyp T (Ziel) Gegeben , eine Casting-Konvertierung von S nach T existiert, wenn keine Kompilierungsfehler aufgrund der folgenden Regeln auftreten.

Ich halte die folgende Art von Zustand zu finden:

Wenn S ein Klasse-Typ ist: Wenn T ein Klassentyp ist, dann entweder |S| <: |T| oder |T| <: |S|. Andernfalls tritt ein Fehler bei der Kompilierung auf.

Außerdem gibt es einen Supertyp X von T und einen Supertyp Y von S, so dass sowohl X als auch Y nachweisbar verschiedene parametrisierte Typen (§4.5) sind, und dass die Löschungen von X und Y gleich sind , ein Kompilierungszeit Fehler tritt auf.

Kann mir jemand ein Beispiel für diese Situation geben?

EDIT:

Zur weiteren Klarstellung des Artikels I link

+0

Ihre Angebote sind nicht im Zusammenhang, und Sie bieten keinen Link zu den relevanten Abschnitten, die Sie angeben, also: Schwer zu sagen. – Andreas

+0

Ich befürchtete, ich könnte Material von außen nicht verwenden, aber ich werde es bearbeiten. vielen Dank für Ihren Kommentar – Rodrigo

Antwort

3

Der erste Teil der Bedingung in Abschnitt 5.5.1 auf dieser verweisen unter Berufung auf mich setzt voraus, dass entweder S <: T oder S :> T, dh ein Klasse muss von der anderen erben; Andernfalls würde ein Kompilierungsfehler auftreten. So sieht Ihre Grundeinstellung wie folgt aus:

class T { 
} 
class S extends T { 
} 

So weit so gut: Sie dürfen S-T werfen, weil es eine richtige Unterklasse Beziehung zwischen den beiden Klassen ist.

Jetzt schauen wir uns den zweiten Teil der Bedingung an: die zwei Klassen müssen verschiedene Supertypen haben. Da nur eine Superklasse zulässig ist, muss der allgemeine Supertyp eine Schnittstelle sein. Hier ist ein Beispiel dafür, wie der zweite Teil der Regel zu brechen:

// X is List<String> 
class T implements List<String> { 
} 
// Y is List<Integer> 
class S extends T implements List<Integer> { 
} 

Löschungen sowohl X und Y Notwendigkeit List<???> zu implementieren, aber die Liste muss auf einen anderen Typ parametriert werden. Dies führt zu einem Fehler bei der Kompilierung, da S keine Möglichkeit bietet, die Schnittstellen List<String> und List<Integer> zu erfüllen.