2012-08-28 9 views
9
public class Test<T>{ 

    public boolean isMember(T item) { 

     if(item instanceof Test) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

Czy to jest poprawny sposób sprawdzenia, czy element jest egzemplarzem klasy?sprawdź, czy element jest egzemplarzem klasy ogólnej

Przeszedłem kilka wyszukiwań i wygląda na to, że dla klasy generycznej to nie zadziała.

+6

Czy próbujesz sprawdzić, czy element jest instancją 'Test', instancją' T', czy instancją 'Test '? – StriplingWarrior

+0

@NinjoeQuah Sprawdź moją odpowiedź – GingerHead

Odpowiedz

5

to jasne, co starasz się przetestować tutaj, ale oto kilka możliwości:

  1. Czy item a T? Tak. W przeciwnym razie prawdopodobnie nie można go przenieść do metody isMember. Kompilator by go zabronił. (Zobacz komentarz Alexa w komentarzach poniżej.)
  2. Czy item jest Test? Twoja metoda isMember, tak jak jest napisana, testowałaby to, ale wyczuwam tu zapach kodu. Dlaczego oczekiwałbyś, że T będzie również Test, ale tylko przez pewien czas? Możesz zastanowić się, w jaki sposób organizujesz swoje zajęcia. Ponadto, jeśli to jest naprawdę to, co chcesz, to metoda może być zapisany jako:

    public boolean isMember(T item) { 
        return (item instanceof Test); 
    } 
    

    Które nasuwa się pytanie: dlaczego mają metody takie jak to w pierwszej kolejności? Które jest łatwiejsze do napisania?

    if(obj instanceof Test) {...} 
    

    lub

    if(Test<Something>.isMember(obj)) {...} 
    

    Uważam, że pierwszy z nich jest prostsze, a większość programistów Java zrozumie, co to znaczy łatwiej niż metody niestandardowej.

  3. Czy item a Test<T>? Nie ma sposobu, aby dowiedzieć się o tym w czasie wykonywania, ponieważ Java implementuje generics przy użyciu usuwania. Jeśli tego chcesz, będziesz musiał zmodyfikować podpis metody tak, aby był jak przykład Mike'a Myersa.

+2

"Kompilator nie pozwoli na to." - Zakładając, że używasz poprawnej ogólnej sygnatury we wszystkich odniesieniach do klasy, to prawda. Nadal można używać odwołań do surowego typu 'Test', aby przekazać element, który nie jest instancją' T' na 'isMember', ale kompilator rzuci na ciebie różnego rodzaju ostrzeżenia, jeśli to zrobisz. – Alex

0

T nie jest zmienną, ale elementem zastępującym klasę zdefiniowaną w środowisku wykonawczym. Generics są funkcją czasu kompilacji, dlatego dodają kontrole w czasie kompilacji, co może nie mieć żadnego znaczenia w czasie wykonywania. Możemy tylko sprawdzić typ obiektu przywoływanego w czasie wykonywania, który może być typem super klasy w kodzie. Jeśli chcemy przekazać typ T jako parametr do metody, wszystko co musisz zrobić, to podejść wyraźnie jak następuje:

void genericMethod(Class<T> tClass) { 
    if(String.class.isAssignableFrom(tClass)) 

lub

void genericMethod(Class<T> tClass, T tArg) { 

uwagę, że typ nie może być tak samo jak tutaj widzimy, jak manipulować:

genericMethod(Number.class, 1); 
0

public class LinkList {

public boolean isMemberOfClass(T item) { 

    if(item instanceof LinkList) 
    { 
     return true; 
    } 
    return false; 
} 

}

Przepraszam, nie jestem suppost odpowiedzieć pytanie jako odpowiedź.

Klasa LinkList jest klasą ogólną. funkcją jest sprawdzenie, czy przedmiot należy do klasy. sprawdź czy masz takie same T.

Powiązane problemy