java - 无法转换到... android

标签 java android android-studio inheritance casting

我创建了一些具有继承概念的类,我有我的应用程序的主类,称为 modulo,它对应于一个模块,还有一些其他类称为 moduloLedRGBModuloSwitch ModuloDimmer,这 3 个类都扩展了 modulo 类,它只有模块的通用参数,如 id、名称、模块类型和 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 的对象的模转换为 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;它可以是 ModuloModuloLedRGBModuloSwitch 或任何其他类的对象。所以在运行时,代码会检查它实际指的是哪种对象。由于上面的示例将 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/

相关文章:

java - 使用ScrollableResults和MySql的字符编码问题

Android OpenCV 颜色检测

android-studio - java.lang.AssertionError : Unexpected node Pythonid; nodes=[org. jetbrains.plugins.terminal,org.jetbrains.plugins.javaFX

android-studio - 跨项目 Android Studio 共享自己的模块

android - Sinch Service 好像没有启动 Android Studio 和 Parse.com (Android Messaging Tutorial)

java - 如何更改所有屏幕上的背景图像并保留更改

Java从http请求接收文件

java - 将后端服务的一行数据放入ListView中

javascript - 为什么相同的按位计算在 Java 和 JavaScript 中会产生不同的结果?

android - 无法获取 webview 的绘图缓存 : android