我创建了一些具有继承概念的类,我有我的应用程序的主类,称为 modulo,它对应于一个模块,还有一些其他类称为 moduloLedRGB
,ModuloSwitch
和 ModuloDimmer
,这 3 个类都扩展了 modulo 类,它只有模块的通用参数,如 id、名称、模块类型和 ipAdress。但是,当我尝试将模块转换到这 3 个子类之一时,出现异常,提示我无法将 Modulo
转换到 ModuloSitch
或 ModuloLedRGB
...
这是我得到错误的地方:
switch (modulo.getModulo()){
case "RGB":
ModuloLedRGB rgb = (ModuloLedRGB) modulo;
rgb.setProgress(c.getDouble(c.getColumnIndex("progress")));
rgb.setProgressRed(c.getDouble(c.getColumnIndex("progressRed")));
rgb.setProgressGreen(c.getDouble(c.getColumnIndex("progressGreen")));
rgb.setProgressBlue(c.getDouble(c.getColumnIndex("progressBlue")));
break;
case "Dimmer":
ModuloDimmer dimmer = (ModuloDimmer) modulo;
dimmer.setProgress(c.getDouble(c.getColumnIndex("progress")));
break;
case"Switch":
ModuloSwitch sw = (ModuloSwitch) modulo;
break;
它说我不能将对应于类 Modulo 的对象的模转换为 ModuloRGB。 getModulo 返回一个字符串,告诉我这是哪种模块。
package br.com.andrey.projetointegradoapp;
/**
* Created by andrey on 04/08/2016.
*/
public class Modulo {
private long id;
private String nome;
private String ModuleIpAdress;
private String modulo;
public String getModulo() {
return modulo;
}
public void setModulo(String modulo) {
this.modulo = modulo;
}
public String getModuleIpAdress() {
return ModuleIpAdress;
}
public void setModuleIpAdress(String moduleIpAdress) {
ModuleIpAdress = moduleIpAdress;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
这是模类。
这是 ModuloLedRGB 类:
package br.com.andrey.projetointegradoapp;
/**
* Created by andrey on 16/12/2016.
*/
public class ModuloLedRGB extends Modulo {
private double progress;
private double progressRed;
private double progressGreen;
private double progressBlue;
public double getProgressRed() {
return progressRed;
}
public void setProgressRed(double progressRed) {
this.progressRed = progressRed;
}
public double getProgress() {
return progress;
}
public void setProgress(double progress) {
this.progress = progress;
}
public double getProgressGreen() {
return progressGreen;
}
public void setProgressGreen(double progressGreen) {
this.progressGreen = progressGreen;
}
public double getProgressBlue() {
return progressBlue;
}
public void setProgressBlue(double progressBlue) {
this.progressBlue = progressBlue;
}
}
关于我为什么会收到此异常的任何想法?既然 child 扩展了主类我想我应该可以把它扔下来,不是吗?
最佳答案
根据评论,您似乎误解了转换的本质。
当你说
class Modulo { ... }
class ModuloLedRGB extends Modulo { ... }
子类化定义了一个is-a关系;每个 ModuloLedRGB
也是一个 Modulo
。但这不是双向的。
如果你创建一个对象
new Modulo()
那么它是一个Modulo
,而不是一个ModuloLedRGB
。如果你创建它
new ModuloLedRGB()
它既是 ModuloLedRGB
又是 Modulo
。说它是一个 Modulo
意味着你可以给它分配一个 Modulo
类型的变量,或者将它用作 Modulo
参数:
ModuloLedRGB x = new ModuloLedRGB();
Modulo y = x; // this is legal, but the object's class doesn't change
y
是对 ModuloLedRGB
对象的引用。但是请注意,虽然 y
被声明为 Modulo
,但它仍然指代同一个对象,其类是 ModuloLedRGB
,因为对象就是这样已创建。
这就是您可以使用向下转型的原因。假设您稍后使用表达式
(ModuloLedRGB)y
此时,编译器只知道y
(如果不为空)是一个Modulo
;它可以是 Modulo
、ModuloLedRGB
、ModuloSwitch
或任何其他类的对象。所以在运行时,代码会检查它实际指的是哪种对象。由于上面的示例将 y
设置为创建为 ModuloLedRGB
的对象,因此转换成功。但是,如果 y
被设置为某个不是 ModuloLedRGB
的其他对象,则转换会引发异常。
此转换不会更改对象,也不会创建新对象。它只是说“确保对象属于 ModuloLedRGB
类,然后将其视为 ModuloLedRGB
,以便我们可以访问特定于 的方法和实例变量>ModuloLedRGB
”。
但是,看起来您正在尝试通过更改对象的类来转换该对象。您已经创建了一个类为 Modulo
的对象,并且您正在尝试创建一些类为 ModuloLedRGB
的新对象。你不能用类型转换来做到这一点。如果您有一个 Modulo
并且您想要创建一个 ModuloLedRGB
,您将必须使用 new ModuloLedRGB()创建一个新对象
,某处。一种常见的方法是编写构造函数:
class ModuloLedRGB extends Modulo {
public ModuloLedRGB(Modulo m, maybe other parameters) {
// copy the instance variables from "m"
this.field = m.field;
this.anotherField = m.anotherField;
// set the new instance variables
this.newField = maybe a parameter or some other computation;
...
}
或者编写一个静态工厂方法来从 Modulo
创建一个新的 ModuloLedRGB
。但是您必须创建它,并且必须编写代码来创建它。您不能从 Modulo
“转换”它。 Java 中没有这样的东西。
关于java - 无法转换到... android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275932/