无法施放到... android

时间:2016-12-22 04:44:03

标签: java android android-studio inheritance casting

我创建了一些带有继承概念的类,我有我的应用程序的主类,称为modulo,它对应于一个模块,还有一些名为moduloLedRGBModuloSwitch的类,和ModuloDimmer,这3个类都扩展了类模,它只包含模块的通用参数,如id,name,Module type和ipAdress。但是,当我尝试将模块转换为这3个子类中的一个时,我得到一个异常,说我无法将Modulo强制转换为ModuloSitchModuloLedRGB ...

这是我收到错误的地方:

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;
    }
    }

为什么我会收到此例外的任何想法?因为孩子扩展了主要课程,我想我应该能够把它丢掉,不是吗?

1 个答案:

答案 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

yModuloLedRGB对象的引用。但请注意,虽然y被声明为Modulo,但它仍然引用同一个对象,其类为ModuloLedRGB,因为这就是创建对象的方式。

这就是你可以使用向下转换的原因。假设您稍后使用表达式

(ModuloLedRGB)y

此时,编译器只知道y(如果不为空)是Modulo;它可以是类ModuloModuloLedRGBModuloSwitch或其他任何内容的对象。因此,在运行时,代码会检查它实际引用的是哪种对象。由于上面的示例将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中没有这样的东西。