To perfekcyjnie zadeklarować metodę z podpisem public <T> T getDate()
.
Jednak niemożliwe jest, aby wdrożyć metodę, która zwraca, co chcesz. To, co metoda wykonuje w środowisku wykonawczym, nie może zależeć od samego parametru typu, ponieważ nie zna jej parametru typu.
Aby uzyskać intuicję, zdaj sobie sprawę z tego, że każdy kod napisany za pomocą generycznych może być również napisany w sposób równoważny bez użycia generycznych, po prostu usuwając ogólne parametry i wstawiając w razie potrzeby rzuty. Oto co oznacza "typ wymazania".
Dlatego, aby sprawdzić, czy metoda byłaby możliwa w rodzajowych, po prostu zapytać, w jaki sposób to zrobić bez rodzajowych:
public Object getDate()
{
// what would you do here?
}
Date myDate = (Date)getDate();
Jeśli nie można tego zrobić bez rodzajowych, nie można tego zrobić z Generics albo.
Szablony C++ są całkowicie różne. W przypadku szablonowych funkcji i klas szablony C++ generują "oddzielną kopię" funkcji lub klasy dla każdego argumentu typu, który jest z nią używany. tj. kompilator przyjmuje szablonowy kod i "kopiuje i wkleja" go do wielu wersji, z których każda jest osobna. Dlatego każda kopia kodu jest specyficzna dla określonego argumentu typu i dlatego może używać tego typu w czasie wykonywania.
To dlatego kod szablonu w formacie C++ jest wymagany, aby był dostępny w formie źródłowej, abyś mógł z niego korzystać - nie ma czegoś takiego jak "skompilowane" szablony. Jednak w Javie można użyć skompilowanej klasy ogólnej. Ogólne klasy i metody w języku Java nie zakładają niczego na temat typów, na których mogą być używane.
co to kupi, że nie można osiągnąć, po prostu rzucając bardziej ogólny zwrot do bardziej konkretnego var? – amphibient
zaktualizował pytanie, aby było bardziej zrozumiałe. – Jason