2011-09-04 6 views
7

Oczywiście Java nie ma delegatów ani funkcji jako wartości pierwszej klasy i zamiast tego korzysta z interfejsów, ale jaki jest najbliższy interfejs dla delegatów Func <> lub Action <> .NET? Istnieje Runnable and Callable <>, ale tylko w smakach nie pobierających parametrów.Co jest najbardziej zbliżoną rzeczą Java do .NET Func <> i Action <> delegatów?

Ponieważ Java nie może być przeciążony typy o tej samej nazwie i różnej liczbie ogólnych argumentów typu, rozumiem, że nie może być pojedynczy wspólna nazwa interfejsu, ale nie może być Runnable1 <>, Runnable2 <> i tak dalej.

Czy ten styl programowania nie jest używany w Javie, czy też brakuje mi jakichkolwiek istniejących interfejsów?

+1

Powrót zanim MS stworzył C#, mieli implementację Java (nazwali ją J ++). Kiedy próbowali dodać do niego delegatów (między innymi wyliczanki), Sun pozwał ich i powiedział, że nie mogą już wysyłać Java. I dlatego stworzyli C#. Jeśli szukasz artykułów o delegatach Java, wiele osób potępia dodanie delegatów do Javy i sugeruje, że anonimowe wewnętrzne klasy implementujące interfejsy są znacznie lepsze! – Gabe

+0

Zobacz także http://java.sun.com/docs/white/sidebar.html – Gabe

+1

"Java nie może mieć przeciążonych typów o tej samej nazwie i różnej liczbie ogólnych argumentów typu": kolejny powód, dla którego usunięcie typu było błędnym podejściem do generics ... –

Odpowiedz

0

Nie jestem zaznajomiony z .Net, ale z tego, co widziałem do tej pory, wydaje się, że zwykle tworzysz interfejs dla każdego typu funkcji/działania, które chcesz przechowywać. To nie jest tak samo, ale brzmi jak to, czego szukasz.

(Interfejs nie jest anonimowy, ma nazwę, znaczenie i dokumentację, dzięki czemu kod jest łatwiejszy do odczytania, z drugiej strony jest to dodatkowy problem, który trzeba napisać, a nie można po prostu wrzucić dowolna funkcja pasująca do podpisu).

Czy masz konkretny przypadek użycia, dla którego szukasz rekomendacji? Trudno jest generalizować wyciągi;).

+1

'Action <>' jest "przeciążony", aby obsłużyć brak powrotu i zero do N parametrów (obecnie 16), więc 'Callable ' jest bezużyteczne. W rzeczywistości, po przeczytaniu opisu 'Callable ', myślę, że Java 'Callable ' może być mapowana tylko na 'C#' Funk ', (która przyjmuje zerowe parametry i zwraca T) i nic więcej. – paercebal

+0

Dzięki, więc interfejsy prawdopodobnie często, choć technicznie bardzo różne, w praktyce są rozsądnym zamiennikiem Akcji . Zaktualizowano odpowiedź, aby to odzwierciedlić. –

+0

Func <> i Action <> są bardzo przydatne, gdy używane są funkcje wyższego rzędu. Jeśli chcę zamapować wszystkie elementy na liście na kolejne jeden, dajemy Func <,> do Wybierz(), aby to zrobić. Może nawet w .NET być nazwanym typem delegata, który byłby najbliższy nazwanemu wyspecjalizowanemu interfejsowi - ale piękno ich anonimowości polega na tym, że funkcje mogą być używane do rzeczy, które nie zostały specjalnie stworzone dla .. . – SoftMemes