2016-11-19 1 views
-1

Ich habe eine Class namens Mineral und andere Klassen, die diese erweitern, wie Gold, Iron und Coal.Schalten Sie eine SuperClass

Ich versuche zu Schalter eine MineralKlasse, um herauszufinden, welche Mineral durch die folgende addMineral Methode übergeben wurde:

public List<Mineral> addMineral(Mineral mineral, int amount){ 
    switch (mineral){ 
     case Gold: 
      break; 
    } 
} 

Aber ich weiß nicht, wie die Klassen einfügen, die Mineral als Fälle erweitern. In der Tat funktioniert das obige Beispiel nicht.

Ist das möglich? Ist das der richtige Weg oder gibt es eine bessere Lösung?

+1

Sie können nicht Schalter mit Objekten verwenden, außer String. Dieser Zusatz kommt in Zukunft mit Pattern Matching zu Java. Siehe hier: (https://youtu.be/e9eSPtpiGkA) – Logan

+0

'if (Mineral instanceof Gold) {...} sonst wenn (Mineral instanceof ...' – EpicPandaForce

+0

Sie es mit einem 'if' zum Beispiel überprüfen müssen : 'if (mineral instanceof Gold) {...}' –

Antwort

1

Sie können nicht auf beliebiges Objekt wechseln.

Sie können die Klasse eines Objekts nicht einschalten.

Aber Sie können einer Klasse eines Objektes auf den Namen wechseln:

switch (mineral.getClass().getName()) { 
    case "some.pkg.Gold": 
     // some stuff 
} 

Oder Sie könnten mineral.getClass().getSimpleName() verwenden und schalten Sie den Klassennamen ohne den Paketnamen, und so weiter.

Allerdings sind sowohl das Einschalten des Klassennamens als auch das Testen mit instanceof oft "Code-Geruch". Wenn möglich, ist es besser, für andere Unterklassen in anderem Code Polymorphismus anstelle von hard-wireless Sonderfallbehandlung zu verwenden; z.B.

if (mineral.hasSomeProperty()) { 
    // do stuff 
} 
2

Wie bereits im Kommentar angegeben, müssen Sie uns eine if und einem instanceof Operator wie folgt aus:

if(mineral instanceof Gold) { 
... 
} 
else if(...) { 
... 
} 
1

Sie haben mithilfe von instaceof den Objekttyp zu überprüfen.

Zum Beispiel:

if(mineral instanceof Gold) 
    System.out.println("mineral is instance of Gold"); 
else if(mineral instanceof Iron) 
    System.out.println("mineral is instance of Iron"); 
else if(mineral instanceof Coal) 
    System.out.println("mineral is instance of Coal"); 

Here you can find clear picture of this instanceof scenario.

1

Wenn Sie noch Schalter verwenden möchten, versuchen Sie dies:

switch (object.getClass().getSimpleName()){ 
     case : "Gold" 
       //something 
       break; 
     case : "Iron" 
       //something 
       break; 
} 
+2

Es gibt keine Methode 'getClassName' für ein Objekt –

+0

@ErwinBolwidt Sorry dafür, ich habe die Antwort aktualisiert. –

Verwandte Themen