2013-07-11 16 views
5

Możemy uciec z tego w .NET:Dlaczego Java nie zezwala na przeciążenia na podstawie parametrów typu?

interface I<A> {} 
interface I<A, B> {} 

... ale w Javie, ten sam kod spowoduje błąd kompilacji.

To interesujące, biorąc pod uwagę, że nawet jeśli informacje o typie zniknęły w czasie wykonywania, można by oczekiwać, że informacja o numerze parametru typu nadal będzie istniała.

Jeśli to ograniczenie wiąże się z wymazywaniem typu, czy ktoś może wyjaśnić, dlaczego?

+0

Ograniczeniem jest to, że nie można zdefiniować interfejsu więcej niż jeden raz i nie można go przeciążać w ten sposób. W czasie wykonywania, wymazywanie typu zapewniłoby, że zarówno "I" jest faktycznie tym samym typem, który jest niedozwolony, czy technicznie nie zrobiłby tego, co chcesz. –

Odpowiedz

6

To nie jest związane z typem usuwanie tyle do dwuznaczności, które wynikają z korzystania z raw type:

I eye = null; // which 'I' is it? 

Surowce typy są dozwolone w celu dostosowania kodu napisanego przed generyczne zostały wprowadzone w JDK 5.0.

+0

, więc problem nie jest wymazaniem typu per se, tylko fakt, że Java zezwala na użycie typów surowych, które w zasadzie sprowadza się do niejawnego przekazywania obiektu jako argumentu (ów) typu? –

+0

W jaki sposób .NET rozwiązuje ten problem? Surowe typy są niedozwolone? – Thilo

+0

@JSmith Tak naprawdę – arshajii

1

W języku java ogólna klasa/interfejs ma ustaloną liczbę ogólnych parametrów. Po prostu sposób definiowania języka.

najbliższa rzecz do tego, co mówisz może być:

interface I<A> {} 
interface J<A, B> extends I<A> {} 

instancją J jest jeszcze przypisane do zmiennej typu I.

Powiązane problemy