public Integer add(Integer i, Integer j){return i+j;}
public String add(String i, String j){return i+j;}
public <T> T add(T i, T j){return i+j;} //this gives me error.
Mimo że metody wyglądają niemal identycznie, w tym przypadku generics nie może pomóc. Rozważmy to:
public <T> T add(T i, T j){return i+j;}
...
add(new Object(), new Object());
Co to znaczy dodać do zwykłych Object
s razem? Nie, +
nie jest obsługiwany dla Object
i nie jest obsługiwany dla wielu innych typów, które można zastąpić T
.
Tworząc metoda rodzajowa <T> T add(T i, T j)
metoda rodzajowa ogranicza się do metod i działań, które są dozwolone na uniwersalnym typem parametru T
, który skutecznie oznacza jedynie rzeczy, które można zrobić z Object
. Próbujesz użyć metody/operacji +
, która jest coś, co możesz zrobić z Object
.
Możemy spróbować rozwiązać ten problem, znajdując wspólną klasę bazową String
i Integer
, która obsługuje wszystkie metody i operacje, których musimy użyć w naszym ogólnym obiekcie metody. Jeśli istniały takie wspólne klasa bazowa XXXXX
że obsługiwane operatora +
, możemy to zrobić:
public <T extends XXXXX> T add(T i, T j) { return i+j; }
Jednak istnieje żadna klasa wspólna podstawa XXXXX
który obsługuje wszystko, co chcemy zrobić w metoda ogólna (+
), więc generycznych nie można użyć do rozwiązania tego problemu.
Kiedy wykonujesz 'Integer i + Integer j', tak naprawdę nie dodajesz' Integers'. 'Liczba całkowita' nie obsługuje operatora' + '. Zostaną one rozpakowane do 'ints', a nie bezpośrednio dodane jako obiekty" Integer ". Nie można dodawać obiektów ogólnych, ponieważ obiekty nie obsługują operatora '+'. 'Struny' są szczególnym przypadkiem i wspierają' + '. –
Jedynym powodem, dla którego nazwiesz oba przykłady 'add', jest użycie operatorów' + ', co w rzeczywistości jest bezsensownym podobieństwem, ponieważ ma zupełnie inne znaczenie w przypadku łańcuchów i liczb całkowitych. Metody nazw oparte na tym, co faktycznie robią z punktu widzenia wywołującego - tj. "Suma" i "konkatenacja" w tym przypadku byłyby dobrymi nazwami. –