klasa Class<T>

Odpowiedz Nowy wątek
Onioner
2009-03-27 22:11
Onioner
0

Kompilator zgłaszał mi błąd, gdy do kolekcji
Map<Class<annotation>, Class<creator>>
wstawiałem:
put.(MyAnnotation.class, MyCreator.class);

Dopiero gdy zmieniłem kolekcję na:
Map<Class<? extends Annotation>, Class<? extends Creator>>
klasa się kompilowała i wszystko łądnie działało.

Wydawawało mi się, że rozumiem koncepcję generics, czytałem o windcards. Rozumiem wszystkie przykłady z tutoriali, ale tego nie rozumiem.
Może mi ktoś wytłumaczyć dlaczego kompilator zgłaszał błąd?

Pozostało 580 znaków

2009-03-27 22:36

Rejestracja: 11 lat temu

Ostatnio: 4 miesiące temu

0

O ile pamiętam, a niebardzo przykładałem do tego wagi gdy to czytałem. ale w javowym tutorialu o genericsach jest napisane o tym...
Jeśli chcesz móc przypisać jakąś generyczną rozszerzająca/implementującą Twoją generyczną, to musisz zdefiniować typ jako <? extends jakasKlasa>, a nie <jakasklasa>

"? extends jakasKlasa" = "Cokolwiek rozszerzającego jakasKlasa"

Jakby... sam nie wiem czy ma sens to, w jaki sposób to napisałem, ale chyba wiesz, o co chodzi...

Pozostało 580 znaków

Onioner
2009-03-27 23:24
Onioner
0

Domyśliłem się, że trzeba to zawsze zaisywać jako <? extends MyClass>, ale interesuje mnie, dlaczego tak jest ;) Interesują mnie szczegóły techniczne ;P

Pozostało 580 znaków

2009-03-29 00:27

Rejestracja: 13 lat temu

Ostatnio: 4 lata temu

0

Tu bardzo dobry oficjalny tutorial:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Najważniejsza konkluzja według mnie:
Jeżeli metoda przyjmuje kolekcję "? extends jakasKlasa", to nie może nic do niej dodać(ani jakasKlasa, ani żadnej podklasy).

Mam podobny problem. Jak zapisać poniższy kod, aby kompilował się bez ostrzeżeń(bez @SuppressWarnings("unchecked"))? Chodzi o to, że używam List, zamiast List<?>.

private static enum ListType {      
    ARRAY_LIST(ArrayList.class), 
    VECTOR(Vector.class), 
    COW(CopyOnWriteArrayList.class);

    private final Class<? extends List> clazz;

    private ListType(final Class<? extends List> clazz) {
        this.clazz = clazz;
    }

    public Class<? extends List> getClazz() {
        return clazz;
    }
}

Drugie podejście. Używam List<?>, ale nadal na (Class<? extends List<?>>) są ostrzeżenia.
Co ciekawe poniższy kod wbudowany w Eclipsa kompilator kompiluje, a ant już nie (wywala "inconvertible types"). JDK mam najnowsze, w Eclipsie kompatybilność ustawiona na Javę 6.

private static enum ListType {      
    ARRAY_LIST((Class<? extends List<?>>) ArrayList.class), 
    VECTOR((Class<? extends List<?>>) Vector.class), 
    COW((Class<? extends List<?>>) CopyOnWriteArrayList.class);

    private final Class<? extends List<?>> clazz;

    private ListType(final Class<? extends List<?>> clazz) {
        this.clazz = clazz;
    }

    public Class<? extends List<?>> getClazz() {
        return clazz;
    }
}

Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0