当前位置: 首页 > 面试题库 >

将类转换为不相关的接口

鲜于子琪
2023-03-14
问题内容

显然,这会导致编译错误,因为Chair与Cat无关:

class Chair {}
class Cat {}

class Test {
   public static void main(String[] args) {
       Chair chair = new Char(); Cat cat = new Cat();
       chair = (Chair)cat; //compile error
   }
}

为什么当我将Cat引用转换为不相关的接口Furniture时,我只能在运行时得到一个异常,而编译器显然可以告诉Cat没有实现Furniture?

interface Furniture {}

class Test {
   public static void main(String[] args) {
       Furniture f; Cat cat = new Cat();
       f = (Furniture)cat; //runtime error
   }
}

问题答案:

编译的原因

interface Furniture {}

class Test {
   public static void main(String[] args) {
       Furniture f; Cat cat = new Cat();
       f = (Furniture)cat; //runtime error
   }
}

是你可能会拥有

public class CatFurniture extends Cat implements Furniture {}

如果创建CatFurniture实例,则可以将其分配给,Cat cat并且可以将该实例强制转换为Furniture。换句话说,某些Cat子类型可能会实现该Furniture接口。

在第一个例子中

class Test {
    public static void main(String[] args) {
        Chair chair = new Char(); Cat cat = new Cat();
        chair = (Chair)cat; //compile error
    }
}

除非自身从Cat扩展,Chair否则某些子类型不可能Cat扩展Chair



 类似资料:
  • 显然,这会导致编译错误,因为椅子与Cat无关: 那么,为什么只有在运行时,当我将Cat引用转换到不相关的接口家具时,才会出现异常,而编译器显然可以看出Cat没有实现家具?

  • 如果编译并运行前面的代码,结果是

  • 问题内容: 我希望结果是: 汽车通话方式:红色 宝马的致电方式:颜色为黑色 汽车通话方式:颜色为黑色 但是,我得到的结果是: 汽车通话方式:红色 宝马的致电方式:颜色为黑色 宝马的致电方式:颜色为黑色 我哪里错了?以及如何使用超类中的方法在子类对象中获取数据?我可以在BMW课堂上写一个方法来做到这一点。但是,为什么强制转换不起作用?谢谢你! 好!谢谢! 我明白了为什么投射不起作用。 因此,我在BM

  • 问题内容: 我想在下面的代码中改进getCustomerFromDTO方法,我需要从interface {}创建一个结构,目前我需要将该接口编组为byte [],然后将数组解组为我的结构-必须有更好的方法。 我的用例是,我通过rabbitmq发送结构,然后使用具有其他特定于域的数据的通用DTO包装器来发送它们。当我从Rabbit MQ接收DTO时,消息下方的一层将被封送给我的DTO,然后我需要从该

  • Clang和GCC都抱怨格式不正确,并给出了奇怪的诊断。 Clang报告 GCC报告 但是,根据expr.static.cast#4 如果存在从E到T的隐式转换序列([over.best.ics]),则表达式E可以显式转换为类型T 将一个类型转换为同一类型不是叫做标识转换吗? over.best.ics#General-8 如果不需要转换来将参数与参数类型匹配,则隐式转换序列是由标识转换([ove