Bounded type parameters

0

Utknąłem na tym: http://docs.oracle.com/javase/tutorial/java/generics/bounded.html
Niby pierwsze zdanie rozumiem, służą do ograniczenia typów. Jednak nie rozumiem przykładu, a jest on kluczowy:

public class Box<T> {

    private T t;          

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }

    public <U extends Number> void inspect(U u){
        System.out.println("T: " + t.getClass().getName());
        System.out.println("U: " + u.getClass().getName());
    }

    public static void main(String[] args) {
        Box<Integer> integerBox = new Box<Integer>();
        integerBox.set(new Integer(10));
        integerBox.inspect("some text"); // error: this is still String!
    }
}

I jeszcze jedno pytanie: jak rozumieć te literki SUV? Czy w w/w przykładzie obojętnie czy dam U, czy S, U, V? Czy musi być to jedna litera?
Przytoczę z tutoriala..

  • E - Element (used extensively by the Java Collections Framework)
  • K - Key
  • N - Number
  • T - Type
  • V - Value
  • S,U,V etc. - 2nd, 3rd, 4th types
1
  1. Czego tu nie rozumieć? Metoda oczekuje parametru o typie U, a U ma rozszerzać Number jak wynika z sygnatury. String nie rozszerza Number, więc kod się nie kompiluje.
  2. Te literki to kwestia umowna, konwencja szeroko stosowana w Javie, w sumie powinno się tego trzymać. W Scali dla przykładu zwykle po prostu używa się kolejnych liter alfabetu, zamiast takich konwencji.
1

Czy musi być to jedna litera?
nie musi być jedna litera, może być AlaMaKota, ale przyjęło się używać po prostu T jak „typ”. Gdy potrzeba więcej, to naturalnie używa się następnych liter, czyli U i V.

0

W sumie faktycznie, nie ma tu nic do rozumienia, ale po prostu jest nowa dla mnie ta składnia <T extends U> typZwracany nazwaFunkcji :P
W C# mało bawiłem się w interfejsy i tego typu sprawy generyczne, głównie używałem tylko List<T> czy Stack<T>, tu pewnie też tak będzie, ale przynajmniej teraz mam okazję to lepiej zrozumieć.

0

W C# 4.0 wprowadzono wariancję (kowariancję i kontra-wariancję), a to na to samo wychodzi: http://msdn.microsoft.com/en-us/library/dd997386.aspx
ZTCW w Javie jest extends/ super, a w C# in/ out.

0

W C# 4.0 wprowadzono wariancję (kowariancję i kontra-wariancję), a to na to samo wychodzi: http://msdn.microsoft.com/en-us/library/dd997386.aspx
ZTCW w Javie jest extends/ super, a w C# in/ out.

Nie wiem o co dokładnie chodzi w tym pokazanym extends w Javie, ale to wygląda bardziej na taki kod C#, a wariancja to co innego (i jest od .NET 2.0):

interface IBar
{
    void Baz();
}

void Foo<T>(T param)
    where T : IBar  // Constraint on Type Parameter
{
    param.Baz();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1