当前位置: 首页 > 知识库问答 >
问题:

将类强制转换为不相关的接口

夏侯弘量
2023-03-14

显然,这会导致编译错误,因为椅子与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引用转换到不相关的接口家具时,才会出现异常,而编译器显然可以看出Cat没有实现家具?

interface Furniture {}

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

共有1个答案

华宇
2023-03-14

这就是为什么

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

如果您创建了一个CatFurnouse实例,您可以将其分配给Cat cat,并且该实例可以转换为Furnouse。换句话说,可能某些Cat子类型确实实现了Furnouse接口。

在你的第一个例子中

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

 类似资料:
  • 问题内容: 显然,这会导致编译错误,因为Chair与Cat无关: 为什么当我将Cat引用转换为不相关的接口Furniture时,我只能在运行时得到一个异常,而编译器显然可以告诉Cat没有实现Furniture? 问题答案: 编译的原因 是你可能会拥有 如果创建实例,则可以将其分配给,并且可以将该实例强制转换为。换句话说,某些子类型可能会实现该接口。 在第一个例子中 除非自身从扩展,否则某些子类型不

  • 问题内容: 很难找到该主题的任何线索。我只能找到有关将一个功能接口转换为另一个功能接口的问题,以及一些有关Java中类型转换的文章。不是我要找的东西。 这个问题是关于转换的,而我想相反地转换为任何功能接口,例如to 。 我发现的方法是围绕该方法创建一个lambda适配器: 但是我想避免写 赞成更简单的事情,例如 ➥因此,有没有办法将旧的Java 1.1反射库映射到较新的Java 8功能接口,还是我

  • 应用程序属性 我也试图改变mysql的版本仍然一样。我该怎么解决这个?

  • 问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,