2010-05-17 4 views
5

Ich bin sehr neu in Java-Programmiersprache, so ist dies wahrscheinlich dumme Frage, aber ich muss es fragen, weil ich es nicht allein herausfinden kann. Hier ist der Deal.Wie erstellte Methode mit Signatur als Liste

Ich möchte eine Methode erstellen, die bestimmte Objekttypen aus einer Liste extrahiert. Daher sollte die Methode List als Argument erhalten, dh die Liste sollte entweder Object1 oder Object2 enthalten. Ich habe wie folgt versucht:

public Object1 extractObject(List<Object>){ 
    //some pseudo-code 
    ... loop trough list and check if list item is instance of object one return that instance 
    } 

Das Problem bei Verfahren mit List<?> als Methode Argument erklärt, dass ich Kompilierungsfehler von Eclipse Syntax error on token ">", VariableDeclaratorId expected after this token erhalten.

Wie setze ich die Methodensignatur richtig, um Objekttypen Object1 oder Object2 zu akzeptieren? Danke

Das ist mein Code:

protected Object1 getObject1(List<Object> list){ 
     for(Object obj : list) { 
      if(obj instanceof Object1) { 
       return (Object1) obj; 
      } 
     } 
     return null; 
    } 

Bearbeiten - was ist der Unterschied zwischen diesen 2:

public Object1 getObject1(List<Object> list){ 
     for(Object obj : list) { 
      if(obj instanceof Object1) { 
       return (Object1) obj; 
      } 
     } 
     return null; 
    } 

public Object1 extractObject(List<Object> list, Class<Object1> type) { 
    for(Object obj : list) { 
     if(type.isInstance(obj)) { 
      return (Object1)obj; 
     } 
    } 
    return null; // no match found 
} 

Antwort

3
public Object1 extractObject(List<?> list){ 
    //some pseudo-code 
    ... loop trough list and check if list item is instance of object one return that instance 
    return null; 
} 

Sie benötigen eine Variable für Ihre Instanz

Und eine Rückkehr.

+0

schießen, das ist es: D – London

+0

dies ok mit zusätzlichem Casting ist, wird es nicht auf andere Art und Weise – London

+0

@London kompiliert, ist es normal, dass Sie Cast benötigen, können Sie nicht bestanden den Klassentyp deine Liste. –

1

Ich würde so etwas tun - beachten Sie, meine Syntax könnte falsch sein, aber die Idee ist die gleiche.

// this works for any type - just pass in an Object1 
public Object extractObject(List<?> list, Class clazz) { 
    for(Object obj : list) { 
     if(obj.getClass().equals(clazz) { 
      return obj; 
     } 
    } 
    return null; // no match found 
} 

Und nicht-generic:

// this works for just one type 
public Object1 extractObject(List<?> list) { 
    for(Object obj : list) { 
     if(obj.getClass().equals(Object1) { 
      return obj; 
     } 
    } 
    return null; // no match found 
} 

getestet, um die Konzepte mit diesem Treiber:

public static void main(String[] args) { 
    Class c = "".getClass(); 
    if("".getClass().equals(c)) System.out.println("true"); 
    else System.out.println("false"); 
} 

Aus den Kommentaren, betrachten clazz.isAssignableFrom(otherClazz) auch.

+0

@glowcoder ist das ok mit zusätzlichen Casting es wird nicht anders kompilieren – London

+0

Im ersten Snippet - können Sie 'obj instanceof clazz' tun und wenn ja, wie es funktioniert? Von meinem Kopf her hätte ich gedacht, dass Sie 'clazz.isAssignableFrom (obj)' brauchen. –

+0

@glowcoder: -1, weil Sie 'obj instanceof [ein Klassenobjekt]' nicht tun können '. Dies ist nicht möglich. Sie müssen etwas tun wie 'if (clazz.isInstance (obj))' PS: Das 'instanceof' ist zweimal mit einem Kleinbuchstaben. –

1

Wie Sie Generika verwenden, können Sie

tun
public <T> T extractObject(List<?> list, Class<T> type) { 
    for(Object obj : list) { 
     if(type.isInstance(obj)) { 
      return (T)obj; 
     } 
    } 
    return null; // no match found 
} 

Dies wird die gleiche wie die Art der Sie suchen den Rückgabetyp Ihrer Methode machen.

Dank Generika, können wir die gleiche Methode verwenden, um verschiedene Arten von Objekten zu extrahieren:

Object1 object1 = extractObject(list, Object1.class); 
Object2 object2 = extractObject(list, Object2.class); 

Diese auf Hartcodierung der Typprüfung, dass durch die Verwendung obj instanceof Object1 da tun würde dazu führen, benötigen eine deutliche bevorzugt, Methode pro Typ, alle bis auf den Rückgabetyp und die Prüfinstanz fast identisch.

+0

werfen Sie einen Blick auf meine Bearbeitung pls – London

+0

Der Unterschied ist, dass Sie diese Methode verwenden können, um beide Arten abrufen. Wenn Sie den Instanzencheck über instanceof und nicht über Class.isInstance fest codieren, können Sie nur einen Typ zurückgeben. Siehe meine Bearbeitung. – mdma

0

Der Unterschied zwischen den beiden ist nichts. Nach dem javadoc, This method is the dynamic equivalent of the Java language instanceof operator.

Verwandte Themen