java - Java 中兼容类型的正式定义(健全性)

标签 java types casting compilation type-systems

我试图在 Java 中找到可转换(因此不可转换)类型的算法定义。

在我看来,正确的编译器应该在编译时阻止具有不可转换静态类型的表达式之间的显式和隐式转换,无论不可转换的定义是什么。

另一方面,如果每个引用都有一个作为其静态类型的子类型的动态类型,那就太好了,为了防止运行时出现 ClassCastExceptions,编译器应该始终阻止没有静态类型的类型之间的转换。常见亚型。

对我来说有意义的候选定义如下:

  1. 两个类 A 和 B 是可转换的,前提是 A 是 B 的子类型或 B 是 A 的子类型
  2. 接口(interface) I 和类 C 是可转换的,前提是 C 实现 I 或 I 和 C 具有共同的子类型(实现 I 并扩展 C 的类,可能以间接方式)
  3. 两个接口(interface) I1 和 I2 是可转换的,前提是它们具有共同的子类型(一个类或另一个接口(interface))

但是以下代码片段不会给出编译错误(仅在 IntelliJIDEA 中给出警告):

interface A {}
class B {}

class Test {

  public static void main(String[] args) {
    B b  = new B();
    A a = (A)b;    // this casting will produce a run-time error
  }
}
interface M {}
interface N {}
class A implements M {}
class B extends A {}
class C extends A implements N {}

class Test {

  public static void main(String[] args) {
    N x = new C();
    M y = (B)x;   // this casting will produce a run-time error
  }
}
interface M {}
class A implements N{}
interface N {}

class Test {

  public static void main(String[] args) {
    N x = new A();
    M y = (M)x;   // this casting will produce a run-time error
  }
}

总之,我想了解 Java 规范中是否有可转换类型的官方定义,以及它是否已在现有编译器中正确实现。

最佳答案

您问的问题是关于 java 类型系统的健全性(这里有一个很好的 intro on the topic )。

对于java来说,没有正式的定义,但是确实存在一些重构,通过语言语义的微妙性和不一致性,得到像"We were surprised这样的语句,特别是因为它的description相当巨大,不明确且错误。”,除了明显的故障之外,倾向于认为它是 by and large sound

明显的故障源于向后 compatibility issues ,例如将类型化集合置于非类型化集合之上,并且总是可能被采用非类型化方式的操作破坏。转换 OP 的问题可能是该问题的另一种风格,因为人们应该如何看待 char c = (char)1024;

另一方面,fundamental inconsistencies 也已被发现,更多的是“参数多态函数,可以将任何类型转换为任何类型,无需(向下)转换”的级别。查找关于什么是基本的、什么是故障的讨论 here ,还暗示了语言规范和编译器之间的差异。

值得注意的是,这个论点对于 Scala language up to version 2.x 也有效,也许任何其他行业规模的 OO 语言,只有即将推出的 Scala 3 才可以证明是 rid of them 。这项工作花费了贡献者近十年的时间,被认为是面向对象语言领域的一项新鲜事。

关于java - Java 中兼容类型的正式定义(健全性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957067/

相关文章:

c - 指针运算 (char*) &a[1] - (char *)&a[0] == 4

java - MongoDB Solr 搜索以在单个搜索请求中获取文档关系

java - BitmapFactory.decodeFile 返回 null

types - 哪些工具可用于检查/探测 Julia 中的类型

带有 TextIOWrapper 的 python zipfile 模块

c++ - 使用C++制作泛型——共享实现的模板

swift - 错误 : Execution was interrupted, 原因 : EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, 子代码 = 0x0)

Swift Casting 未按预期工作

java - 我的 Struts2 应用程序出现错误 404 : Resource not available

java - 适用于 Mac OS 的 Outlook(独立应用程序)加载项