Java中兼容类型的形式定义(声音)

阿尔贝托(Alberto):

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

我认为,CORRRECT编译器应在编译时阻止具有不可转换静态类型的表达式之间的显式和隐式转换,无论不可转换的定义如何。

另一方面,由于每个引用都具有一个动态类型(它是其静态类型的子类型)会很好,因此,为了在运行时防止ClassCastExceptions,编译器应始终阻止没有公共子类型的类型之间的转换。

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

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

但是,以下代码片段不会产生编译错误(例如,仅在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规范中是否存在(可转换类型的)正式定义,以及是否已在现有编译器中正确实现。

古里厄(Güriösä):

您要问的问题是关于Java类型系统的健全性(这是该主题的不错的介绍)。

就Java而言,没有正式的定义,但是确实存在许多重构,得出如下语句:我们对语言语义的微妙和不统一感到惊讶,特别是因为其描述相当庞大,模棱两可,而且错误。” 有认为这是一种趋势,通过和大的声音从很明显的毛刺,分开。

明显的故障源于向后兼容性问题,例如,将类型化集合放在未类型化集合的顶部,并且始终可以通过采用未类型化方式的操作来破坏。投下OP的问题可能是该问题的另一种味道,因为人们应该怎么看char c = (char)1024;

另一方面,还发现了基本的不一致性,更多的是在“ 可以将任何类型转换为任何类型而无需(向下)转换的参数化多态函数 ”的级别上查找有关什么是根本,什么是毛刺讨论这里,也暗示在语言规范,编译器之间的差异。

值得一提的是,该参数对于版本2.x以下的Scala语言也有效,也许适用于其他任何行业规模的OO语言,只有即将发布的Scala 3可以证明是有效的这项工作花了将近十年的时间,并且在面向对象语言领域中被认为是新颖的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章