dwie opcje do sprawdzania typu wykonawczego z rodzajowych:
Wariant 1 - Corrupt konstruktora
Załóżmy, że są nadrzędne indexOf (...) i chcesz sprawdź typ tylko dla osiągnięcia wydajności, aby zapisać siebie w iteracji całej kolekcji.
Zrób brudny konstruktor tak:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
Następnie można użyć isAssignableFrom do sprawdzenia typu.
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
każdorazowym wystąpienia swój obiekt trzeba by powtarzać sobie:
new MyCollection<Apples>(Apples.class);
Możecie zdecydować, że nie warto. W implementacji ArrayList.indexOf(...) nie sprawdzają, czy typ jest zgodny.
Wariant 2 - Niech to nie
Jeśli trzeba użyć abstrakcyjną metodę, która wymaga nieznanego typu, to wszystko, czego naprawdę chcę to kompilator przestać płakać o instanceof. Jeśli masz metody takie jak to:
protected abstract void abstractMethod(T element);
Można go używać tak:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
Jesteś odlewania obiekt do T (typu generycznego), po prostu oszukać kompilatora. Your cast does nothing at runtime, ale nadal będzie występować wyjątek ClassCastException podczas próby przekazania niewłaściwego typu obiektu do abstrakcyjnej metody.
UWAGA 1: Jeśli wykonujesz dodatkowe niezaznaczone rzuty w swojej abstrakcyjnej metodzie, twoje Wyrażenia Klasyfikacji Klasowej zostaną tu złapane. To może być dobre lub złe, więc przemyśl to.
UWAGA 2: You get a free null check when you use instanceof. Ponieważ nie możesz go użyć, możesz sprawdzić zerową wartość gołymi rękami.
Nie sądzę, że chcesz "Class.isAssignableFrom". –
@Tom, napisałem tę ostatnią noc z pamięci, i naprawiłem ją, aby faktycznie przejść zajęcia (duh!), Ale poza tym, nie rozumiem, dlaczego nie chciałbyś tego (może potrzebuję więcej kawy dziś rano, ja tylko na mojej pierwszej filiżance). – Yishai
Jestem z Tomem. Czy możesz to wyjaśnić? Używanie metody isAssignableFrom() byłoby moim wyborem do tej pracy. Może coś mi brakuje? –