JAVA将 "unknown"类型的对象转换为另一个对象的类型

标签 java dynamic casting extends

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

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。温度传感器类。

Geraetetypen(Devicetypes)是一个ArrayList,包含所有可用的传感器和Actor。

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

因此它应该与此(强制转换)执行相同的操作:

mErlaubt.add( (Temperatursensor) pGeraet);

但我不想使用(温度传感器)进行显式转换。我想使用从比较的数据类型列表中找到的数据类型进行动态转换。

也许类似于带有注释的行//MY PROBLEM,但这不起作用。

我知道这很难,而且我的描述也不是很好,但我希望你理解我尝试做的事情。请帮忙。如果您不明白或有疑问,请询问..谢谢!

最佳答案

引用您的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;
  }

关于JAVA将 "unknown"类型的对象转换为另一个对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29651181/

相关文章:

java - 枚举 Java 的最佳方法

Ruby:包含动态模块名称

javascript - 在 Javascript 中刷新元素样式

c - 指针和类型转换

c++ - 在 C++ 中将 uint8_t* 转换为 uint32_t*

java - 为什么我的数组搜索在搜索循环超过 2000 次后花费了 0 纳秒?

java - 如何在android Appium测试自动化中制作可选的appPackage和appActivity BeforeScenario

java - 使用 Java 通配符

vector - 将值切片转换为字节切片

c# - 如何将 where 子句与 IQueryable<dynamic> 一起使用