“instanceof”检查抛出 CompileTimeError “无法安全地转换”

Kai*_*nst 4 java instanceof pattern-matching

我有这个内部类 Node,在 instanceof 检查时遇到这个奇怪的错误。我尝试用谷歌搜索,为什么会这样,但它只显示“不可转换类型”错误,而这不是。我还尝试将 Node 设为静态类,但这也没有帮助。我对此有点困惑,因此非常感谢您的帮助。提前致谢。

import java.util.Objects;

public abstract class Graph<E> {
    protected class Node {
        E item;

        protected Node(final E item) {
            this.item = item;
        }

        @Override
        public boolean equals(final Object o) {
            if (this == o)
                return true;
            else if(item == null)
                return false;
            else if(o instanceof final Node node) //error: "java: java.lang.Object cannot be safely cast to Graph<E>.Node"
                return item.equals(node.item);

            return item.equals(o);
        }

        @Override
        public int hashCode() {
            return Objects.hash(item);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读一些答案后,我意识到我只犯了一个愚蠢的错误,该错误在这段代码中得到了纠正:

import java.util.Objects;

public abstract class Graph<E> {
    protected class Node {
        E item;

        protected Node(final E item) {
            this.item = item;
        }

        @Override
        public boolean equals(final Object o) {
            if (this == o)
                return true;
            else if(item == null)
                return false;
            else if(o instanceof final /* Error was not using a wildcard*/ Graph<?>.Node node) //also after some confusion this (final Node node) is a java 16 feature
                return item.equals(node.item);

            return item.equals(o);
        }

        @Override
        public int hashCode() {
            return Objects.hash(item);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

我认为问题是,您在参数化类中使用内部类。并且instanceof检查不知道应该对哪个参数进行强制转换。