2012-04-02 10 views
8

Ten kod kompiluje:Rodzaj parametr z wieloma granicami

import java.io.Serializable; 
import java.util.Arrays; 
class Test<T extends Arrays & Serializable> { } 

ale jeśli mogę wymienić ostatnią linię z

class Test<T extends Serializable & Arrays> { } 

otrzymuję „interfejs oczekiwać tutaj”. Czemu?

Odpowiedz

13

Od section 4.4 of the JLS:

Każdy typ zmiennej zadeklarowany jako parametr typ ma granicy. Jeśli nie zostanie zadeklarowana żadna granica dla zmiennej typu, zakłada się obiekt. Jeżeli granica została zadeklarowana, składa się albo:

  • pojedyncza zmienna typu T lub

  • klasa lub interfejs typu T ewentualnie następuje typów interfejsów I1 & ... & In.

Jest to błąd podczas kompilacji, jeśli którykolwiek z typów I1 ... In jest zmienną typu lub typu klasy.

Więc w zasadzie, jeśli granice obejmują klasę, to musi być pierwszy związany.

(Zważywszy, że Arrays nie może być instancja, to jest jasne, dlaczego byś chcą oprawiony w tym to, pamiętajcie ... to był tylko przykład?)

+1

«był to tylko przykład?» Tak, to było :-) Właśnie eksperymentowałem z ograniczonymi parametrami typu. Dziękuję za Twoją odpowiedź. – Gmacar

0

Jeśli jedna z granic jest klasa, musi być określona jako pierwsza.