2012-09-23 14 views
17

This Link stwierdza co następuje:Co to jest typ sparametryzowany?

konkretyzacją rodzajowy typu z rzeczywistych argumentów typ nazywany jest rodzaj parametryzowane. Przykład (typu sparametryzowane):

Collection<String> coll = new LinkedList<String>();

Więc co jest parametryzowane typ?

  • Collection<String> lub
  • LinkedList<String>
+5

Jak o czytanie następne zdanie w linku, który podałeś: „Deklaracja Collection oznacza typ sparametryzowane, co stanowi instancji generycznego typu Collection, gdzie miejsce uchwyt E został zastąpiony przez konkretny typ String "? –

+0

@JBNizet, Tak, moje zamieszanie wynika z typu instancji 'LinkedList '. Twój komentarz poniżej wyjaśnia to dla mnie. – wulfgarpro

Odpowiedz

22

Obaj są parametryzowane typy: rodzaje, które mają inne typy jako parametry.

Fakt, że masz różne typy po dwóch stronach wyrażenia, jest nieistotny i ma do czynienia z zachowaniem polimorficznym, tj. Ponieważ LinkedList jest podtypem Collection.

1

Oba zastosowania kolekcji

Collection<String> 
LinkedList<String> 

są parametryzowane typy tu z String jest stosowany typ.

11

Parametr sparametryzowany ogólnie jest klasą, która zajmuje się innym obiektem bez ciekawego typu. Typ może być zdefiniowany przy użyciu symbolicznej "nazwy", a następnie przekazywany, gdy tworzona jest klasa klasy.

Na przykład

class MyClass<T> { 
    private T obj; 
    public MyClass<T>(T obj) { 
     this.obj = obj; 
    } 
    public int getId() { 
     return obj.hashCode(); 
    } 
} 

W powyższym przykładzie MyClass okłady Przedmiot według dowolnego typu, wykonuje sposób jego hashCode() wykorzystując fakt, że ten sposób zawsze istnieje.

Oto jak ta klasa jest używana:

int sid = new MyClass<String>("aaaa").hashCode();

Proszę zwrócić uwagę, że nie można powiedzieć new MyClass<String>(123): fakt, że obiekt jest tworzony z parametrem String dyktuje rodzaj argumentu konstruktora.

Powracanie do twojego przykładu Collection<String> oznacza "zbiór ciągów". Oznacza to, że nie można dodać do tego zbioru obiektu innego typu.

+0

jeśli masz gdzie T jest ciągiem, to możesz przekazać wszystkie podklasy T, prawda? – Ungeheuer

+0

Prawie poprawne. Poza tym, że String jest klasą końcową i nie można go rozszerzyć. – AlexR

+0

Więc w zasadzie wszystkie typy ogólne są Typy sparametryzowane, prawda? –

0

Parametr Parametr Typ oznacza typ sparametryzowany, taki jak Kolekcja.

Typ sparametryzowany jest tworzony przy pierwszym użyciu metody refleksyjnej, określonej w tym pakiecie. Kiedy tworzony jest sparametryzowany typ p, generowana jest deklaracja rodzajowa, która p jest instancja, a wszystkie argumenty typu p są tworzone rekurencyjnie. Zobacz TypeVariable, aby uzyskać szczegółowe informacje na temat procesu tworzenia zmiennych typu. Powtórne tworzenie sparametryzowanego typu nie ma żadnego efektu.

Wystąpienia klas implementujących ten interfejs muszą zaimplementować metodę equals(), która zrównuje dwie instancje, które mają tę samą deklarację rodzajową i mają parametry o równym typie.

4

Wygląda na to, że rodzajowy i sparametryzowany typ są synonimami. Ale nie wydaje się słuszne, aby nazywać na przykład typ ogólny, ponieważ w znaczeniu tego słowa nie jest już generyczny. Więc prawdopodobnie:

typ rodzajowy jest deklaracja parametr formalny typ/s

class Box<T> { .. } 

Box<T> jest ogólny typ

parametrycznego typ jest deklaracja z rzeczywistego typu argumentu/s

Box<Integer> b;   

Box<Integer> jest parametryzowanym typem

Typ surowy to deklaracja typu ogólnego bez rzeczywistego argumentu/argumentów typu.

class Box<T> { .. } 
Box b; 

Box to rodzaj surowego