2009-09-04 10 views
11

Czy jest możliwe określenie domyślnego typu podczas parametryzowania klasy? Przykład:Opcjonalna parametryzacja w języku Java z generics

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class> { 
     // code 
    } 


// parametrized imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1, ClassThatExtendsPar2Class> { 
    // code 
} 

// non-parametrized imlementation class 
public class RealClass extends AbsClass { 
    // code 
} 

w moim realizacji muszę podać Brak lub wszystkich parametrów. Jest możliwe, aby drugi parametr był nieobowiązkowy, coś takiego:

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class : default Par2Class > { 
     // code 
    } 

// parametrized only mandatory imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1> { 
    // code 
} 

Odpowiedz

18

Prosta odpowiedź: nie, java nie obsługuje takich domyślnych parametryzacji.

1

Nie ma naprawdę dobrego powodu, aby to zrobić. Zazwyczaj określa się ogólne parametry typów, ponieważ niektóre argumenty metody pobierają lub zwracają parametr tego typu. Jeśli nieokreślone byłyby prawidłowe, mogłoby to sugerować, że nie zamierzasz przeprowadzić żadnej sensownej implementacji tych metod.

W każdym razie, aby rozwiązać swój problem, po prostu określ "Obiekt" dla dowolnego parametru, którego nie chcesz określać. Lub rozszerz klasę abstrakcyjną o inną klasę abstrakcyjną, która ma tylko jeden parametr typu (określając obiekt jako parametr drugiego typu w swoim rozszerzeniu).

+1

z mojego punktu widzenia nie jest dobry powód to zrobić. Ponieważ mój "opcjonalny parametr" (T2 rozszerza Par2Class) jest klasą, której używamy jako obiektu wartości i jest rozszerzony w wielu innych klasach. Jeśli nie określiłem T2, po prostu używam domyślnych metod z ValueObject. Jeśli określę, potrzebuję konkretnych metod i nie muszę rzucać. Myślałem o wprowadzeniu kolejnej klasy w porządku dziedziczenia, ale byłem ciekawy opcjonalnej parametryzacji. Dzięki. – davorp

+0

Mogę się mylić, ale myślę, że są takie przypadki użycia. W języku C++, gdzie dozwolone są typy szablonów typu defaut, są one używane np. do dostarczania domyślnej wersji alokatora pamięci dla typów STL. – Rom1

+0

Typowym dobrym zastosowaniem jest parametr pośredni typu SwingWorker, jeśli jest taki sam jak parametr wynikowy. –

0

Cóż, poprawne rozwiązanie w Twoim przypadku może być

// parametrized only mandatory imlementation class 
public class RealClass<StillGeneric extends Par1Class> 
extends AbsClass<ClassThatExtendsPar1, StillGeneric> { 
    // code 
} 
+0

Ale potrzebuję "sparametryzowanych" metod z AbsClass. Jeśli sparametryzuję RealClass, w moim przypadku nie będzie z niego korzystać. Czy źle coś oceniam? – davorp