【问题标题】:Below Code is compiling in some IDE and not in some IDE "Java is Unsound"下面的代码在某些 IDE 中编译,而不是在某些 IDE 中“Java 不健全”
【发布时间】:2017-01-28 16:37:31
【问题描述】:

Java 不健全https://hackernoon.com/java-is-unsound-28c84cb2b3f#.8tf5qumlb

在本文中讨论了 java 类型安全,它在某些 java 版本中编译,而不是在某些 java 版本中编译。

class Unsound {
    static class Constrain<A,B extends A>{}
    static class Bind<A> {
        <B extends A>
        A upcast(Constrain<A,B> constrain , B b){
            return b;
        }
    }
    static <T,U> U coerce(T t){
        Constrain<U,? super T> constrain = null;
        Bind <U> bind = new Bind<U>();
        return bind.upcast(constrain,t);
    }
    public static void main(String ...s){
        String zero = Unsound.<Integer,String>coerce(0);
    }
}

https://raw.githubusercontent.com/namin/unsound/master/doc/unsound-oopsla16.pdf

所以如果他们说这归结为一个空指针错误。但与大多数空指针错误不同

所以只是无法理解它在不同 IDE 上的编译或非编译

还有一个与之相关的开放错误https://bugs.openjdk.java.net/browse/JDK-8054941

还有 eclipse https://bugs.eclipse.org/bugs/show_bug.cgi?id=510900

【问题讨论】:

  • 为什么这是在某些版本中编译而不是在某些版本中。有些事情已经解决或尚未解决?
  • 这比您之前的问题尝试要好。但问题是什么?
  • 如果您的问题是“您的代码是否应该编译”,答案是否定的。如果是这样,则相关编译器存在错误。
  • 那么它为我编译?

标签: java generics compiler-errors wildcard openjdk


【解决方案1】:

您的问题的答案在您引用的文章中。

如果您的编译器没有对我们的示例进行类型检查,我有消息要告诉您。不,您的编译器没有发现错误。事实上,你的编译器本身就有一个错误。你的编译器坏了。 Java 规范说这个例子应该类型检查和编译。

现在只需将这一点与不同的 IDE 可能使用不同的编译器(Eclipse 使用它自己的编译器,IntelliJ 默认使用 javac,但它是可配置的,等等)相结合,你就有了嫌疑。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多