interface A {
String n();
}
class B implements A {
@Override
public String n() { return "asdf"; }
}
interface C<T extends A> {
T m(T t);
}
class D implements C<B> {
@Override
public B m(B b) {
return b;
}
}
Class<C<? extends A>> x = D.class;
jest błąd na ostatniej liniidlaczego działa ten typ wieloznaczny?
Type mismatch: cannot convert from Class<D> to Class<C<? extends A>>
to wygląda perfekcyjnie do mnie, ale może jestem trochę brakuje subtelności, w jaki sposób pracować typu symbole wieloznaczne. Czy jest sposób, w jaki mogę zmienić typ na ostatniej linii? Muszę to odwołanie, ponieważ mam zamiar to zrobić później:
B b = new B();
A y = x.newInstance().m(b);
Ma to również błąd
The method m(capture#1-of ? extends A) in the type C<capture#1-of ? extends A> is not applicable for the arguments (B)
jednak, jeśli go używać bez symboli wieloznacznych i wychwytywania, to działa dobrze:
A z = D.class.newInstance().m(b);
Niestety, jakoś utknąłem z tym teraz, każda pomoc byłaby doceniona.
edit: usunięty this.
referencje
edit: X zmienił się
Class<? extends C<? extends A>> x = D.class;
i to działa. jednak wciąż otrzymuję błędy na x.newInstance().m(b)
The method m(capture#2-of ? extends A) in the type Test.C<capture#2-of ? extends A> is not applicable for the arguments (B)
czy 'B implementuje A' chociaż? Mam 'B' w tym przykładzie, ale chcę, aby biblioteka pracy z' A''s. Biblioteka jest biblioteką preferencji lub konfiguracji. A to HasPreferences, a C jest serializowalną klasą Preference.więc będą podtypy każdego z podklasami C , co oznacza, że C jest obiektem preferencji dla A. – aepurniet
C otrzyma A, aby pobrać dane konfiguracyjne z. i zastosuje na nich także konfigurację. może istnieć wiele C dla A. (dlatego tak i templatowałem to w ten sposób, a nie na odwrót) – aepurniet
@aepurniet: 'B' implementuje' A', ale parametr 'Cm' nie jest typu 'A' - jest typu' T'. 'D' może polegać na otrzymaniu instancji' B', a nie jakiejś innej implementacji 'A'. Właśnie dlatego powoduje problem. Nie ma nic w deklaracji "klasy rozszerza C extends A>> 'który wspomina' B' ... –