2016-11-19 6 views
-1

У меня есть Class под названием Mineral и другие классы, которые распространяют этот, например Gold, Iron и Coal.Переключатель SuperClass

Я пытаюсь переключательMineralкласса, для того, чтобы выяснить, какие минеральный было прошло по следующей addMineral методы:

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

Но я не знаю, как для вставки классов, которые расширяют Минерал как случаи. На самом деле приведенный выше пример не работает.

Возможно ли это? Правильно ли это или есть лучшее решение?

+1

Вы не можете использовать переключатель с объектами, за исключением String. Это дополнение подходит для Java в будущем с помощью Match Matching. См. Здесь: (https://youtu.be/e9eSPtpiGkA) – Logan

+0

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

+0

вам нужно проверить его с помощью 'if', например : 'if (mineral instanceof Gold) {...}' –

ответ

1

Вы не можете переключиться на произвольный объект.

Вы не можете включить класс объекта.

Но вы можете переключиться на имя класса объекта:

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

Или вы могли бы использовать mineral.getClass().getSimpleName() и включить имя класса без имени пакета, и так далее.

Однако, как включение имени класса, так и тестирование с использованием instanceof часто «запах кода». Если возможно, лучше использовать полиморфизм, а не жесткую проводку для обработки отдельных подклассов в другом коде; например

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

Как указано в комментарии уже, вы должны нам if и instanceof оператора, как это:

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

Вы должны проверить тип объекта с помощью instaceof.

Например:

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

Если вы все еще хотите использовать переключатель, попробуйте следующее:

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

. Нет метода 'getClassName' для объекта. –

+0

@ErwinBolwidt Извините за это, я обновил ответ. –