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

投射到不相关的接口时为什么要编译?

洪高阳
2023-03-14
问题内容

interface Printable {}
class BlackInk {}

public class Main {
    public static void main(String args[]) {
        Printable printable = null;
        BlackInk blackInk = new BlackInk();
        printable = (Printable)blackInk;
    }
}

如果前面的代码已编译并运行,则结果为ClassCastException printable = (Printable)blackInk;。但是,如果将Printable更改为一个类,则因为blackInk无法转换为Printable而无法编译。当Printable是接口时,为什么要编译?


问题答案:

编译器不知道这是行不通的:您可能具有实现Printable的BlackInk子类。那演员就好了。

在编译器知道它不起作用的情况下,您会得到一个错误。

例如,如果您制作BlackInk final(这样就不能有子类),则会出现错误。



 类似资料:
  • 如果编译并运行前面的代码,结果是

  • 以下是异常日志: 下面是android.app.ContextImpl.GetSharedReferences异常抛出的代码 让我们假设日志信息是正确的,它应该几乎是正确的。 我的第一个问题是:在文件的第358行抛出强制转换异常ContextImpl.java什么意思?那里只有一个右括号。 我猜第358行下面的语句是异常的根本原因 因为sp被声明为SharedReferencesImpl,并且当g

  • 问题内容: 我们需要大量的序列化工作,并且必须在使用的每个对象上指定标签,这是一种负担。特别是当它是第三方类时,我们不能真正更改。 问题是:由于是一个空接口,并且Java一旦添加便提供了可靠的序列化 为什么它们不使所有内容都可序列化,仅此而已? 问题答案: 序列化充满陷阱。这种形式的自动序列化支持使类内部成为公共API的一部分(这就是javadoc为你提供类的持久化形式的原因)。 为了实现长期持久

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

  • 问题内容: 在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。 我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。 这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。 有没有解释我为什么需要接口的示例? 问题答案: 接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。 接口是一种 工具

  • 问题内容: 仅仅是因为动态类型,我们不需要python中的接口概念(例如Java和C#)吗? 问题答案: 将 作为关键字和神器是在Java引入1(和C#把它从那里)来描述一下合同的对象必须坚持为。 但是,接口一直是面向对象范例的关键部分,基本上它表示对象必须响应的方法。Java只是强制执行此机制以提供静态类型检查。 因此,动态(OO)编程语言 确实会 使用接口,甚至认为它们不会静态检查它们。就像其