2016-12-03 3 views
-1

Ich habe eine Klasse:Wie Cast zu unknow Klasse

public class Example { 
    public String name; 
} 

aber diese Klasse nicht aufgerufen werden, Beispiel verschieden sein kann (wie Example2, AnotherExample ich weiß nicht, wie), das Problem ist, dass Ich weiß nicht, wie man mich anruft.

In einer anderen Klasse habe ich eine Methode, die als Parameter eine Liste von Objekten übernehmen. Mein Beispiel Klasse:

public class ObjectClass{ 
    public List<Object> doSomething(List<Object> objects) { 
     for(int i = 0 ; i < objects.size();i++) { 
      Class<?> c = objects.get(i).getClass(); 
      System.out.println("class name " + c.getCanonicalName());// i get name my class 
      System.out.println(((Example) objects.get(i)).name); 
     } 
    } 
} 

Wenn ich die Besetzung Beispiel in einer anderen Klasse wie diese System.out.println(((c) objects.get(i)).name); es funktioniert nicht ändern.

Meine Klasse kann sich anders als Cast an Beispiel wird nicht funktionieren. Generell möchte ich Wert des Namens erhalten, während ich nicht weiß, wie die Klasse benannt ist. Aber ich wähle welche Klasse mit einem Feldnamen (oder mit einer Anmerkung). Edit: ist ein Problem, es ist meine Hausaufgaben und ich kann nicht Klasse Beispiel ändern, und ich kann nicht ändern, Methode DoSomething.

Antwort

0

Wenn Sie speziell nach einem Feldnamen suchen, können Sie auch alle Felder durch Reflexion iterieren und das Recht auf Zugang ein.

public List<Object> doSomething(List<Object> objects) { 
    for (int i = 0; i < objects.size(); i++) { 
     Class<?> c = objects.get(i).getClass(); 
     for (Field field : c.getFields()) { 
      if ("name".equals(field.getName())) { 
       try { 
        System.out.println("class name " + c.getCanonicalName());// i get name my class 
        System.out.println(field.get(objects.get(i))); 
       } catch (Exception e) { 

       } 
      } 
     } 
    } 
    return null; 
} 
0

Willkommen in der wunderbaren Welt des Polymorphismus. Hier ist, was Sie tun können:

interface Named 
{ 
    String getName(); 
} 

public class Example implements Named 
{ 
    public String name; 

    @Override 
    public String getName() 
    { 
     return name; 
    } 
} 

public class AnotherExample implements Named 
{ 
    public String name; 

    @Override 
    public String getName() 
    { 
     return name; 
    } 
} 

dann können Sie dies tun:

 System.out.println(((Named) objects.get(i)).getName()); 

dann natürlich würde ich auch empfehlen, dass Sie folgendermaßen vorgehen:

public List<Named> doSomething(List<Named> objects) { 

so dass dann Sie können dies tun:

 System.out.println(objects.get(i).getName()); 

Edit achtern er Klarstellung:

Wenn Sie nicht Ihre eigene Schnittstelle hinzufügen, dann versuchen, etwas wie folgt aus:

Object foo = objects.get(i); 
if(foo instanceof Example) 
{ 
    Example example = (Example)foo; 
    ...do something with example... 
} 
else if(foo instanceof AnotherExample) 
{ 
    AnotherExample anotherExample = (AnotherExample)foo; 
    ...do something with anotherExample... 
} 
else 
{ 
    assert false; //I do not know what class this is. 
} 
+0

Dank für Versuch helfen, aber ich hinzufügen, bearbeiten zu meinem Beitrag, da ich nicht Klasse Beispiel ändern kann, und ich kann meine eigene Schnittstelle nicht hinzufügen, kann ich nur das, was Code schreibt in Klasse Object (ich kann 't chcange Declaration method doSomethnig) – grapexs

+0

@grpexs siehe bearbeiten. –

+0

Ich denke, dass es immer noch nicht das ist, was ich meine, weil mein Homowerk ist, dass ich nicht weiß, wie eine Klasse heißt. Mein Lehrer nannte Klasse Beispiel wie er will, ich kenne keinen Klassennamen. – grapexs