2015-04-15 3 views
1

Im new here, и я хочу начать с моего первого, а не простого описания вопросов. Я думаю, что часть кода может объяснить лучше всего.JAVA cast Объект с «неизвестным» типом в виде другого объекта

public void erlaube(Geraet pGeraet){ 
    for(Object g : mGeraetetypen){           
     if(pGeraet.getClass().equals(g.getClass())){       
      System.out.println("TRUE"); 
      mErlaubt.add((g.getClass())pGeraet); // MY PROBLEM      
     } 
     //System.out.println(pGeraet.getClass()); 
     //System.out.println(g.getClass()); 
    } 
} 

А «Geraet» (устройство) является абстрактным классом, и это может быть датчик или актер f.ex. класс Temperaturesensor.

Geraetetypen (Devicetypes) является ArrayList и содержит все доступные датчики и актеры.

Блокировка for и if проверяет, является ли параметр Object объектом типа, содержащегося в списке Devicetypes f.ex. Датчик температуры. , если это так, я хочу добавить его в качестве этого типа данных (Temperaturesensor) в массив «mErlaubt» (mAllowed) ArrayList.

Так оно и должно делать то же самое, как это (CAST):

mErlaubt.add((Temperatursensor) pGeraet); 

Но я не хочу, чтобы бросить явно с (Temperatursensor). Я хочу бросить динамический тип данных, который я нашел из Datatypelist, который сравнивается.

Возможно, что-то вроде строки с комментарием // МОЯ ПРОБЛЕМА, но это не работает.

Я знаю, что это сложно, и мое описание не очень хорошо, но я надеюсь, что вы понимаете, что я пытаюсь сделать. Пожалуйста помоги. Если вы что-то не понимаете и не задаете вопрос, пожалуйста, спросите .. Спасибо!

+1

можно заливать объекты с помощью [ 'Class.cast'] (HTTP: // docs.oracle.com/javase/7/docs/api/java/lang/Class.html#cast(java.lang.Object)) метод, e. г. 'G.getClass(). Литая (pGeraet)'. –

+1

Какой тип 'mGeraetetypen' и' mErlaubt'? Я думаю, что есть более эффективный подход к вашей проблеме. –

+0

Тип обоих: ArrayList

ответ

0

Со ссылкой на ваш code sample, я хотел бы предложить, чтобы сохранить допустимые классы вместо экземпляров разрешенных классов.Вы можете использовать этот измененный код:

public class Deviceplace { 

    Set<Class<? extends Geraet>> mErlaubt; 

    public Deviceplace(){ 
    mErlaubt = new HashSet<>(); 
    } 

    public void erlaube(Class<? extends Geraet> clazz) { 
    mErlaubt.add(clazz); 
    } 

    // Option 1: no subtypes of the allowed types 
    public boolean isErlaubt(Geraet pGeraet) { 
    return mErlaubt.contains(pGeraet.getClass()); 
    } 

    public static void main(String[] args) { 
    Deviceplace place = new Deviceplace(); 
    place.erlaube(Temperatursensor.class); 
    System.out.println(place.isErlaubt(new Windsensor())); 
    System.out.println(place.isErlaubt(new Temperatursensor())); 
    } 

} 

Альтернативная реализация isErlaubt, которая также включает в себя подтипы будет:

// Option 2: including subtypes of the allowed types 
    public boolean isErlaubt(Geraet pGeraet) { 
    for(Class<? extends Geraet> clazz : mErlaubt){ 
     if (clazz.isAssignableFrom(pGeraet.getClass())) { 
     return true; 
     } 
    } 
    return false; 
    } 
0

Если mErlaubt является ArrayList из Geraet суперкласса, то вы просто должны использовать mErlaubt.add(pGeraet);

Ваш mErlaubt должен затем быть определен как: List<Geraet> mErlaubt = new ArrayList<Geraet>();

+0

omg справа. Мне не нужно бросать его. Это работает .. –

0

Вы хотите получить класс от конкретного элемента список и передать другой объект этому классу? Помимо someClass.cast(someObject), решений не будет. Но, насколько я вижу, весь этот код не имеет никакого смысла. Вы добавите один объект несколько раз. И кроме этого я бы сказал, что это скорее работа для Generics, чем casting.

0

Я думаю, что это изменение должно работать так, как pGeraet имеет класс Geraet, поэтому работа над переменной должна быть отличной.

for(Object g : mGeraetetypen){           
     if(pGeraet.getClass().equals(g.getClass())){       
      System.out.println("TRUE"); 
      mErlaubt.add((Geraet)pGeraet); 
     } 
+0

, который тоже должен работать. Но pGeraet уже является типом Geraet. Таким образом, он также работает без этого актера. благодаря –

0

Спасибо всем! Я хочу поделиться своим простым простым решением для всех. Класс - это Deviceplace для датчиков/актеров на графическом интерфейсе houseautomation. Каждый Deviceplace позволяет только рукой полный Sensor/Актеры (f.ex. нет отопления на месте снаружи)

public class Deviceplace { 

ArrayList<Geraet> mErlaubt; //allowed devices 

public Deviceplace(){ 
    mErlaubt = new ArrayList<>(); 
} 

public void erlaube(Geraet pGeraet){ //add allowed device 
      mErlaubt.add(pGeraet); 
} 

public boolean isErlaubt(Geraet pGeraet){ // check if device is allowed on this place 
     for(Geraet g : mErlaubt){ 
      if(g.getClass().isInstance(pGeraet)){ 
       return true; 
      } 
     } 
     return false; 
} 

public static void main(String[] args) { 
    Deviceplace place = new Deviceplace(); 
    place.erlaube(new Temperatursensor());   // ad Temperaturesensor as allowed device 
    // now check if a device is allowed on this deviceplace 
    System.out.println(place.isErlaubt(new Windsensor()));   // RETURNS false (Windsensor not allowed) 
    System.out.println(place.isErlaubt(new Temperatursensor())); // RETURNS true (Temperaturesensor allowed) 
} 

}

Смежные вопросы