我是新来的,我想从第一个不太容易描述的问题开始。我认为一段代码最能解释。
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/