Java i typy generyczne

Opublikowane: 01/10/2015

w kategorii Zasoby.

Wstęp

Typy generyczne w Javie pozwalają zdefiniować klasę lub interfejs który operuje na kilku różnych typach obiektów - w zależności od deklaracji typu klasy.

Przykładowa klasa:

public class Pair<T, U> {
  private T first;
  private U second;

  public Pair() { first = null; second = null; }

  public Pair(T firstValue, U secondValue) {
    first_ = firstValue;
    second_ = secondValue;
  }

  public String toString() {
    return "(" + first + ", " + second + ")";
  }
}

// użycie:
Pair<String, Integer> pair = new Pair<>("Mach", 3);
System.out.println("Para: " + pair);

Dłuższa wersja: Pair.java

Różnice pomiędzy typami generycznymi Java i szablonami C++

Typy generyczne Java bardzo różnią się od szablonów C++:

Plusy:

  • w Javie możesz łatwo wyspecyfikować wymagania dla przodka lub klas potomnych

Minusy:

  • nie możesz używać typów prymitywnych jako argumentów generycznych
  • informacja o typie jest usuwana podczas wykonywania programu (szukaj "type erasure" oraz "refleksje" poniżej)
  • nie możesz pracować z liczbami w uniwersalny sposób - z uwagi na "type erasure" oraz brak odpowiednich metod w klasie bazowej (Number) - zobacz N.1
  • nie możesz bezpośrednio użyć "new" na typie generycznym lub tablicy tego typu

Neutralnie:

  • aby wymienić typ tylko raz używasz operatora diamentowego zamiast "auto"

Materiały wprowadzające

Skrajne przypadki

Używanie refleksji

Producer Extends Consumer Super - reguła PECS

Reguła ta pochodzi ze świetnej książki "Java. Efektywne programowanie" napisanej przez Joshua Bloch (punkt 28) i opisuje w skrócie kiedy używać ograniczeń "extends" oraz "super" w typach generycznych.

Zobacz poradniki:

Rozwiązania

Książki

  • "Java Generics and Collections" - Maurice Naftalin / Philip Wadler, 2006

Zobacz również

Udostępnij

obserwuj