Java 带泛型的OpenJML?

Java 带泛型的OpenJML?,java,jml,Java,Jml,我有一个类Edge.java。当我通过OpenJML运行它时,会发生以下情况: 错误:发生内部JML错误,可能是可恢复的。请尽可能多地报告错误信息。 原因:com.sun.tools.javac.code.Symbol$TypeSymbol无法强制转换为com.sun.tools.javac.code.Symbol$ClassSymbol 奇怪的是,我甚至还没有开始输入jml符号 我的jdk是1.7,openjml是当前重新下载的,以确保两者 这是用于从站点运行openjml的命令,示例如下:

我有一个类Edge.java。当我通过OpenJML运行它时,会发生以下情况:

错误:发生内部JML错误,可能是可恢复的。请尽可能多地报告错误信息。 原因:com.sun.tools.javac.code.Symbol$TypeSymbol无法强制转换为com.sun.tools.javac.code.Symbol$ClassSymbol

奇怪的是,我甚至还没有开始输入jml符号

我的jdk是1.7,openjml是当前重新下载的,以确保两者

这是用于从站点运行openjml的命令,示例如下: java-jar E:\Downloads\openjml\openjml.jar-esc-prover z3_4_3-exec E:\Downloads\z3-4.3.0-x64\bin\z3.exe-noPurityCheck Test.java

编辑: 我可以确认,即使是带有泛型的非常简单的类也会导致此错误:

public class Test<T> {
    T i;
}
java

public class Edge<K> implements Comparable<Edge<K>> {
    public K n1, n2;
    public int weight;

    public final int tiebreaker;
    public static int nextTiebreaker = 0;

    public Edge(K n1, K n2, int weight) {
        this.n1 = n1;
        this.n2 = n2;
        this.weight = weight;
        tiebreaker = nextTiebreaker++;
    }

    @Override
    public int compareTo(Edge<K> o) {
        if(this.weight > o.weight) return +1;
        if(this.weight < o.weight) return -1;

        return tiebreaker - o.tiebreaker; //Same cost, pick one to be the "larger" 
    }
}

我发现的解决方法是删除-esc选项运行扩展静态检查。不确定解决这个问题的正确方法。

我也面临类似的问题,但在temp\u release目录下的B.java文件上使用-esc选项

java -jar openjml.jar -noPurityCheck -esc  -progress -exec /Library/bin/z3 -prover z3_4_3 B.java
Proving methods in B
Starting proof of B.B() with prover z3_4_3
error: An internal JML error occurred, possibly recoverable.  Please report the bug with as much information as you can.
  Reason: Unexpected result when querying SMT solver for reason for an unknown result: success
Completed proof of B.B() with prover z3_4_3 - with warnings
B.爪哇是

public class B { /*@ invariant true; */ }.

Completed proving methods in B

您使用的是什么版本的java?需要是Java1.7。再次尝试下载OpenJML?我刚刚在您的Edge.java上运行了它,它没有报告任何错误。您正在做比java-jar openjml.jar Edge.java更复杂的事情吗?如果是这样,请使用post命令行。你们有SMT校准仪吗?哪一个?抱歉,我将编辑问题以包含更多信息。我可以确认我在Linux上使用yices SMT prover得到相同的异常。