JAVA 将对象与 "unknown" 类型转换为另一个对象的类型
JAVA cast Object with "unknown" type in type of another Object
我是新来的,我想从我的第一个不太容易描述的问题开始。我觉得一段代码可以解释得最好。
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"(设备)是一个抽象Class,它可以是一个传感器或一个演员f.ex。 class 温度传感器。
Geraetetytypen (Devicetypes) 是一个 ArrayList,包含所有可用的传感器和 Actors。
for 和 if 块检查参数 Object 是否是 Devicetypes 列表中包含的 Object 类型 f.ex。温度感应器。
如果是,我想将其作为此数据类型(温度传感器)添加到 "mErlaubt" (mAllowed) ArrayList。
所以它应该和这个(演员表)一样:
mErlaubt.add( (Temperatursensor) pGeraet);
但我不想使用 (Temperatursensor) 进行显式转换。我想用我从比较的数据类型列表中找到的数据类型进行动态转换。
可能类似于注释行 //MY PROBLEM,但这行不通。
我知道这很难,我的描述也不是很好,但我希望你能理解我试图做的事情。请帮忙。如果您不明白或有疑问,请提问。谢谢!
如果您的 mErlaubt 是 Geraet 超类的 ArrayList,那么您只需要使用 mErlaubt.add(pGeraet);
然后您的 mErlaubt 必须定义为:List<Geraet> mErlaubt = new ArrayList<Geraet>();
您想从列表的特定项目中检索 class,并将另一个对象转换为该 class?除了someClass.cast(someObject)
,不会有任何解决方案。但据我所知,这整个代码没有任何意义。您将多次添加一个对象。除此之外,我想说 Generics
比 casting
.
更适合做这份工作
我认为此更改应该有效,因为 pGeraet
属于 Class Geraet
,因此将变量转换为超级 class 应该有效。
for(Object g : mGeraetetypen){
if(pGeraet.getClass().equals(g.getClass())){
System.out.println("TRUE");
mErlaubt.add((Geraet)pGeraet);
}
谢谢大家!我想与所有人分享我非常简单的解决方案。 class 是家庭自动化 GUI 上 Sensors/Actors 的设备位置。每个 Deviceplace 只允许装满一手 Sensor/Actors(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)
}
}
关于您的 ,我建议存储允许的 类 而不是 实例 允许的 类。您可以使用此修改后的代码:
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;
}
我是新来的,我想从我的第一个不太容易描述的问题开始。我觉得一段代码可以解释得最好。
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"(设备)是一个抽象Class,它可以是一个传感器或一个演员f.ex。 class 温度传感器。
Geraetetytypen (Devicetypes) 是一个 ArrayList,包含所有可用的传感器和 Actors。
for 和 if 块检查参数 Object 是否是 Devicetypes 列表中包含的 Object 类型 f.ex。温度感应器。 如果是,我想将其作为此数据类型(温度传感器)添加到 "mErlaubt" (mAllowed) ArrayList。
所以它应该和这个(演员表)一样:
mErlaubt.add( (Temperatursensor) pGeraet);
但我不想使用 (Temperatursensor) 进行显式转换。我想用我从比较的数据类型列表中找到的数据类型进行动态转换。
可能类似于注释行 //MY PROBLEM,但这行不通。
我知道这很难,我的描述也不是很好,但我希望你能理解我试图做的事情。请帮忙。如果您不明白或有疑问,请提问。谢谢!
如果您的 mErlaubt 是 Geraet 超类的 ArrayList,那么您只需要使用 mErlaubt.add(pGeraet);
然后您的 mErlaubt 必须定义为:List<Geraet> mErlaubt = new ArrayList<Geraet>();
您想从列表的特定项目中检索 class,并将另一个对象转换为该 class?除了someClass.cast(someObject)
,不会有任何解决方案。但据我所知,这整个代码没有任何意义。您将多次添加一个对象。除此之外,我想说 Generics
比 casting
.
我认为此更改应该有效,因为 pGeraet
属于 Class Geraet
,因此将变量转换为超级 class 应该有效。
for(Object g : mGeraetetypen){
if(pGeraet.getClass().equals(g.getClass())){
System.out.println("TRUE");
mErlaubt.add((Geraet)pGeraet);
}
谢谢大家!我想与所有人分享我非常简单的解决方案。 class 是家庭自动化 GUI 上 Sensors/Actors 的设备位置。每个 Deviceplace 只允许装满一手 Sensor/Actors(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)
}
}
关于您的
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;
}