2015-09-03 23 views
7

czytając od typu odniesienia odlewania SE opisie Java:trudnych warunkach, aby zrozumieć, ze specyfikacją Java

Biorąc pod uwagę w czasie kompilacji typu referencyjnego (źródła) i kompilacji typu odniesienia T (cel) , konwersja odlewania istnieje od S do T, jeśli nie wystąpią błędy w czasie kompilacji z powodu następujących reguł.

Trzymam znalezienie następujące rodzaj Stan:

Jeśli S jest typem klasy: Jeśli T jest typem klasy, wówczas |S| <: |T| lub |T| <: |S|. W przeciwnym razie wystąpi błąd podczas kompilacji.

Ponadto, jeśli istnieje nadtypu X z T i nadtypu Y z S, tak, że zarówno X, jak i Y są naprzemiennie sparametryzowanymi typami (§ 4.5) i że skreślenia X i Y są takie same , pojawia się błąd kompilacji .

Czy ktoś może podać mi przykład takiej sytuacji?

EDIT:

Dla dalszego wyjaśnienia artykule mam powołując znajduje się w rozdziale 5.5.1 na tym link

+0

Twoje cytaty są niezgodne z kontekstem i nie podajesz linku do odpowiednich sekcji, które cytujesz, więc: Trudno powiedzieć. – Andreas

+0

Obawiałem się, że nie mogę korzystać z materiałów z zewnątrz, ale będę edytować. Dzięki za komentarz – Rodrigo

Odpowiedz

3

Pierwsza część stanu wymaga, aby zarówno S <: T lub S :> T, czyli jednym klasa musi dziedziczyć z drugiej; w przeciwnym razie wystąpiłby błąd podczas kompilacji. Więc podstawowa konfiguracja wygląda następująco:

class T { 
} 
class S extends T { 
} 

tak daleko tak dobre: ​​masz prawo do oddania S do T, ponieważ nie jest właściwe relacje podklasy między dwiema klasami.

Teraz spójrzmy na drugą część warunku: dwie klasy muszą mieć różne supertypes. Ponieważ dozwolona jest tylko jedna nadklasa, wspólna nadtyp musi być interfejsem. Oto jeden z przykładów jak złamać drugą część reguły:

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

skreśleń zarówno X i Y konieczności realizacji List<???>, ale lista musi być programowane na innego typu. Powoduje to błąd podczas kompilacji, ponieważ S nie ma możliwości zaspokojenia obu interfejsów List<String> i .