2014-09-21 16 views
18

Moja metoda pobiera klasę jako parametr i muszę sprawdzić, czy moja zmienna jest typu klasy.java - Jak sprawdzić, czy mój obiekt jest typu danej klasy?

Volvo v1 = new Volvo(); 
Class aClass = v1.getClass(); 
check(aClass); 

wewnątrz muszę zrobić coś jak

v2 instanceof aClass ? "True" : "False"); 

ale to nie robi; t skompilować.

+0

Jeżeli kompilator nie być w stanie sprawdzić dla ciebie? Jak deklarujesz swoją metodę sprawdzania? –

+0

v2 instanceof ** Class **?"Prawda fałsz"); – Nabin

+1

Pachnąłem możliwym użyciem anty-deseń tutaj i ponownie zastanawiam się, czy przy użyciu generycznych lepiej określić typ parametru może być lepszym i czystszym rozwiązaniem, aby umożliwić rozwiązanie problemu w ** czasie kompilacji ** nie na ** czas działania **. –

Odpowiedz

27

Myślę, że chcesz aClass.isInstance(v2). Słowo kluczowe docs say it works the same as the instanceOf. Domyślam się, że nie mogą używać instanceOf jako nazwy metody, ponieważ słów kluczowych nie można używać jako nazw metod.

v2 = ??? 
Volvo v1 = new Volvo(); 
Class aClass = v1.getClass(); 
aClass.isInstance(v2)  // "check(aClass)" 

A może po prostu użyj literówki klasowej, jeśli "Volvo" jest stałą wartością.

v2 = ??? 
Volvo.class.isInstance(v2); 
13
Volvo v = new Volvo(); 
    if (v instanceof Volvo) { 
     System.out.println("I'm boxy, but safe."); 
    } 
+0

Może pomóc wyjaśnić, co to robi/dlaczego jest prawidłową odpowiedzią. – Whymarrh

1

Można spróbować także:

aClass.isAssignableFrom(v2.getClass()) 

Gdzie "aClass" jest nadklasą "v2"

4

Jak Poduszkowiec Full węgorzy wspomniano, można generalnie uniknąć takie wyraźne wywołania metod, opierając się na kompilatorze, aby wykonać sprawdzanie. Niektóre podejścia:

  • Piszesz pojemnik typowo typowanego przedmiotu. Niech typu rzeczy być T, następnie Java pozwala wyrazić to w sposób następujący:

    public class MyClass<T> { private T thing; public void setThing(T t) { this.thing = t; } private void check(Class<T> cls) {} // probably not necessary }

    Następnie należy utworzyć instancje MyClass<T> następująco: MyClass<Volvo> m = new MyClass<Volvo>(); lub od Java 7: MyClass<Volvo> m = new MyClass<>();

  • Naprawdę potrzebujesz klasy, powiedzmy, ponieważ pracujesz z typami Enum i wiele z tych metod jest sparametryzowanych przy użyciu odpowiedniej klasy:

    public void check(Class<?extends SuperType> validClsAutomaticallyChecked) {}

  • Wystarczy obiektu określonego supertypem być przekazywane do metody:

    public void pass(SuperType thatSimple) {}

  • Nie trzeba, nie może lub nie chce uczynić zawierające klasa ma parametr rodzaju rzeczy do przejścia, ale nadal chcesz wykorzystać generyczne metody w swojej metodzie. Może to być przydatne, aby kompilator mógł wywnioskować, że to, co robisz w treści metody jest bezpieczne. Na przykład możesz utworzyć kolekcję rzeczy typu T w oparciu o typ rzeczy przekazanej jako parametr do metody.

    public <T> void workWith(T genericallyTypedObject) {}

Powiązane problemy