2010-06-20 21 views
8

Mam pewien stary kod parsujący argumenty wiersza polecenia, napisany 4 lata temu dla Java 5, i nie będzie on kompilowany w Javie 6, dzięki zmianom w sposobie obsługi generycznych i/lub określeniu pewnych klas bibliotek. Próbując to naprawić, natknąłem się na następujący problem; odkąd minęły 4 lata, odkąd dotknąłem Javy i nigdy nie byłem ekspertem od generyków, zaczyna mnie to denerwować.Nie może być tak specyficzny w typach pól ogólnych Java, jak w przypadku ogólnych typów metod?

Biblioteka pozwala mi określić, że niektóre opcje wiersza polecenia odpowiadają wyliczeniom. Aby to zrobić, obiekt ArgumentSpecification odpowiadający tej opcji chce zatrzymać obiekt Class, który nazwiemy "enumClass", odpowiadający klasie enum. Niestety, nie potrafię wymyślić, jak poprawnie napisać typ tego pola, aby ograniczyć go do obiektów klasy, które odpowiadają rzeczywistym klasom Enum. Myślę, że to, czego chcę, to coś w rodzaju:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error 

, ale kompilator na tym polega. Z drugiej strony, kompilator jest całkowicie zadowolony z metod, które mają wartości i/lub parametrów wrócić określona w ten sposób:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works" 

mogę wypróbować to na polu Zamiast:

protected Class<? extends Enum<?>> enumClass; 

jednak, że tak naprawdę nie działa, albo ... inne części kodu potrzebują typu "<E extends Enum<E>>", aby mogły dostać się do E, a to nie pasuje do "<? extends Enum<?>>", ponieważ dostaję błędy kompilatora w następujący sposób:

Bound mismatch: The generic method checkedEnumFromString(Class<E>, String) of type EnumUtil is not applicable for the arguments 
(Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded 
parameter <E extends Enum<E>> 

Czy istnieje sposób, aby zadeklarować pole o poprawnym typie, którego tutaj brakuje? Jeśli tak, co to jest? Jeśli nie, to czy nie jest to straszliwie zepsute Java, aby móc deklarować typy metodami, których nie można dla pól? Czy jestem tak okropnie zdezorientowany, że moje pytanie nie ma sensu na początek?

Odpowiedz

9

Jeśli trzeba zdefiniować pole z wyraźną parametru E takiego, to może trzeba sparametryzować typ, w którym pole jest zadeklarowane w coś takiego kompiluje.

class MyClass<E extends Enum<E>> { 
    Class<E> enumClass; 
} 
+2

Bałem się tego ... ugh. Myślę, że w moim przypadku byłoby mniej kludgy, aby zaakceptować, że system typu Java jest opóźniony (dziękuję, usuń typ!) I użyj "Class enumClass;" w połączeniu z liberalnym pieprzonym @ShutTheHellUp ("niezaznaczonym"); Dziękuję za odpowiedź. –

7

starasz zadeklarować "pole ogólne" - takie, które ma sam parametr typu. Nie ma takiej koncepcji w Javie - tylko metody i typy mogą wprowadzać parametry typu.

Jako, że poliolelarustanty mówią, możesz wprowadzić dodatkowy typ parametru w samym typie i użyć go jako typu pola.

Powiązane problemy