JAVA cast对象,带有;“未知”;键入另一个对象的类型

JAVA cast对象,带有;“未知”;键入另一个对象的类型,java,dynamic,casting,extends,Java,Dynamic,Casting,Extends,我是新来的,我想从我的第一个不太容易描述的问题开始。我认为一段代码可以最好地解释 public void erlaube(Geraet pGeraet){ for(Object g : mGeraetetypen){ if(pGeraet.getClass().equals(g.getClass())){ System

我是新来的,我想从我的第一个不太容易描述的问题开始。我认为一段代码可以最好地解释

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”(设备)是一个抽象类,它可以是传感器或Actor f.ex。类温度传感器

GerateTypen(Devicetypes)是一个ArrayList,包含所有可用的传感器和参与者

for和if块检查参数对象是否为Devicetypes列表f.ex中包含的对象类型。温度传感器。 如果是,我想将其作为此数据类型(Temperaturesensor)添加到“mErlaubt”(mAllowed)ArrayList

因此,它应该执行与此相同的操作(cast):

但我不想用(温度传感器)进行显式转换。我想使用从比较的Datatypelist中找到的数据类型强制转换dynamic

也许有点像评论行//我的问题,但这不起作用


我知道这很难,我的描述也不是很好,但我希望你能理解我的意图。请帮忙。如果你不理解某事或有问题,请提问。。谢谢

如果您的mErlaubt是Geraet超类的ArrayList,那么您只需使用
mErlaubt.add(pGeraet)


然后必须将mErlaubt定义为:
List mErlaubt=new ArrayList()

是否要从列表的特定项检索类,并将另一个对象强制转换到此类?除了
someClass.cast(someObject)
,没有任何解决方案。但就我所见,整个代码毫无意义。您将多次添加单个对象。除此之外,我认为这是
泛型
的工作,而不是
转换

我认为这种改变应该起作用,因为
pGeraet
属于
Geraet类,所以将变量转换为超类应该起作用

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

谢谢大家!!我想和大家分享我非常简单的解决方案。该类是houseautomation GUI上传感器/参与者的Deviceplace。每个Deviceplace仅允许一只手放满传感器/演员(例如,室外无加热装置)

公共类Deviceplace{
ArrayList mErlaubt;//允许的设备
公共设备位置(){
mErlaubt=newarraylist();
}
public void erlaube(Geraet pGeraet){//添加允许的设备
mErlaubt.add(pGeraet);
}
公共布尔isErlaubt(Geraet pGeraet){//检查此位置是否允许使用设备
(杰拉特g:梅劳特){
if(g.getClass().isInstance(pGeraet)){
返回true;
}
}
返回false;
}
公共静态void main(字符串[]args){
Deviceplace位置=新Deviceplace();
place.erlaube(新温度传感器());//将ad温度传感器作为允许的设备
//现在检查此deviceplace上是否允许使用设备
System.out.println(place.isErlaubt(new Windsensor());//返回false(不允许使用Windsensor)
System.out.println(place.isErlaubt(new Temperaturesensor());//返回true(允许使用Temperaturesensor)
}
}

关于您的,我建议存储允许的类,而不是允许的类的实例。您可以使用此修改后的代码:

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()));
  }

}

您可以使用以下方法强制转换对象:e。g
g.getClass().cast(pGeraet)
mGeraetetypen
mErlaubt
的类型是什么?我认为有一种更有效的方法解决您的问题。两者的类型都是ArrayList,然后您可以编写:
mErlaubt.add(pGeraet)
,因为
pGeraet
被声明为
Geraet
的实例。最好使用
g.getClass().isInstance(pGeraet)
来允许子类型。这也应该有效。但普杰雷特已经是杰拉特的类型了。所以它也可以在没有这个演员的情况下工作。谢谢
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)
}
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()));
  }

}
  // 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;
  }