我创建了一些带有继承概念的类,我有我的应用程序的主类,称为modulo,它对应于一个模块,还有一些名为moduloLedRGB
,ModuloSwitch
的类,和ModuloDimmer
,这3个类都扩展了类模,它只包含模块的通用参数,如id,name,Module type和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作为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;
}
}
这是Modulo Class。
这是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;
}
}
为什么我会收到此例外的任何想法?因为孩子扩展了主要课程,我想我应该能够把它丢掉,不是吗?
答案 0 :(得分:1)
根据评论,您似乎误解了投射的本质。
当你说
时class Modulo { ... }
class ModuloLedRGB extends Modulo { ... }
子类定义是-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
”的方法和实例变量。 / p>
然而,看起来您正试图通过更改其类来转换对象。您已经创建了一个类为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;
...
}
或编写静态工厂方法以从ModuloLedRGB
创建新的Modulo
。但你必须创建它,你必须编写代码来创建它。您无法从Modulo
“转换”它。 Java中没有这样的东西。