Jeśli zadeklarujesz rodzajowe metodę, zawsze niech rozmówcę decydowania, które argumenty typu użyć dla parametrów typu. Implementacja metody musi być w stanie obsłużyć wszystkie możliwe typy argumentów (i nie ma nawet sposobu na zapytanie o rzeczywiste argumenty typu).
Powiedział, że metoda jak <T> void fly(T obj);
stwierdza, że rozmówca może używać dowolnego typu dla T
natomiast jedyną rzeczą realizacja może polegać na to, że rzeczywisty typ dla T
będą przypisane do Object
(jak gdyby <T extends Object>
została zadeklarowana) .
W tym konkretnym przykładzie nie różni się od deklaracji , która pozwala również na dowolne obiekty.
Natomiast parametr typu na interface
jest częścią umowy i mogą być określone lub ograniczone przez realizacji z interface
:
public interface Flight<T>{
void fly(T obj);
}
pozwala implementacje jak
public class X implements Flight<String> {
public void fly(String obj) {
}
}
ustalanie typu T
po stronie implementacji. Lub
public class NumberFlight<N extends Number> implements Flight<N> {
public void fly(N obj) {
}
}
będąc nadal rodzajowy ale ograniczając rodzaj.
Podpis o interface
jest również, gdy sam interface
jest częścią innej metody, na przykład podpisu
public void foo(Flight<? super String> f) {
f.fly("some string value");
}
tutaj, realizacja Flight
, które przechodzą do foo
, musi być zdolny do spożywania wartość String
, więc Flight<String>
lub Flight<CharSequence>
lub Flight<Object>
są wystarczające, ale nie Flight<Integer>
. Zgłoszenie takiej umowy wymaga parametrów typu na interface
, a nie na metodach interface
.
chcesz jeden insatnce realizacji 'flight' aby móc obsłużyć w "fly" metoda tylko jeden wybrany typ danych lub dowolnego rodzaju danych? – Pshemo