[JAVA] Wie in Abhängigkeit vom Datentyp in einem Object-Array code Ausführen?

  • Themenstarter Themenstarter BlackPanter
  • Beginndatum Beginndatum
B

BlackPanter

Guest
Hi,

ich habe in Java ein Object Array.
Jetzt möchte ich, wenn in einem der Felder nen weiteres Array drinn ist, dieses Array durchlaufen.

Ich kann zwar abfragen, was für nen Klassentyp in dem jeweiligen Feld steckt, aber nicht in abhängigkeit davon was ausführen. Mir wird immer nen Syntaxfehler angezeigt. (Was grundsätzlich ja auch sinvoll ist)

Gibt es ne Möglichkeit oder muss ich mir ne andere Möglichkeit überlegen?

Grüße
Sören
 
Also etwas mehr Informationen wären nicht schlecht, oder auch ein Codeausschnitt, was du bisher machst.
Was für ein Array hast du da genau? Einfach Object[] oder ArrayList<Object>?
Warum kannst du nicht beim Durchlaufen auch ein Array durchlaufen? Wie fragst du denn den Typ des Arrayeintrags ab?
 
Ich kann zwar abfragen, was für nen Klassentyp in dem jeweiligen Feld steckt, aber nicht in abhängigkeit davon was ausführen.
Code:
if (myArray[i] instanceof myType[]) { // code }
Wobei ich keine Ahnung habe, wie sich das verhält, wenn man primitive mit Objekt-Arrays vergleicht.
Via Reflection:
Code:
if (myArray[i].getClass().isArray()) { // code}

Ich vermute aber mal, dass es wesentlich sauberer wäre, mehrere gleichnamige Methoden zu programmieren, die jeweils Parameter unterschiedlicher Typen nehmen.
 
das geht schon leicht in Richtung Duck-typing Pattern ;) (bei "vollständigen" DuckPattern würde man aber "direkt" eine bestimmte Methode eines Elements im Array aufrufen wollen)

Ich würde da zu t3rr0r.bYt3s Lösung via Reflection raten.
http://stackoverflow.com/questions/1079785/whats-an-example-of-duck-typing-in-java

Code:
public class Main
{

    public static void do_something(Object arr[])
    {
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);
    }
    
    public static void main(String[] args)
    {
        Object small_arr[] = {1, 2, 3};
        
        Object big_arr[] = {new A(), new B(), small_arr, 42};
        
        for (int i = 0; i < big_arr.length; i++)
        {
            if (big_arr[i].getClass().isArray())
                do_something((Object[])(big_arr[i]));
        }

    }

}
(wobei A und B einfach dummy Klassen sind):
Code:
public class A
{
    private int content = 1;
    public int getContent()
    {
        return this.content;
    }
}

sofern es aber primitive Arrays sein sollen, wird es komplizierter:
Code:
public class Main
{

    public static void do_something(Object arr[])
    {
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);
    }
    
    public static void do_something_primitive(int arr[])
    {
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);
    }
    
    public static void main(String[] args)
    {
        Object small_arr[] = {1, 2, 3};
        int small_arr2[] = {100, 200, 300};        
        Object big_arr[] = {new A(), new B(), small_arr, 42, small_arr2};
        
        for (int i = 0; i < big_arr.length; i++)
        {
            if (big_arr[i].getClass().isArray())                
                if (big_arr[i].getClass().getComponentType() == int.class)
                    do_something_primitive((int[])big_arr[i]);            
                else    
                    // hier können auch weitere typprüfungen stehen                 
                    do_something((Object[])(big_arr[i]));
                
        }

    }

}


Afaik (schon _länger_ her, daher würde ich für folgende Aussage auch nicht unbedingt meine Hand ins Feuer legen ;)) wird es für primitive Datentypen auch keine "schönere" Lösung geben, da die Arrayzugriffe in der JavaVM unterschiedliche Opcodes zum laden/speichen von primitiven Daten/Objecten haben.
 
Zurück
Oben