首页 文章

类型安全:通过varargs参数子树的潜在堆污染[重复]

提问于
浏览
0

这个问题在这里已有答案:

我有效的Java和我得到的未经检查的演员阵容永远不会好,除非我们确保演员阵容是安全的 . 现在,由于Java Collection框架没有为我们提供 Tree 数据结构,我必须自己编写 .

public interface TreeVisitor<E, R> {
    public R visit(E leaf);

    public R visit(E val, Tree<E>... subtrees);
}

public abstract class Tree<E> {

    public abstract <R> R accept(TreeVisitor<E, R> visitor);

    public Tree<E> leaf(E leaf) {
        return new Tree<E>() {
            @Override
            public <R> R accept(TreeVisitor<E, R> visitor) {
                return visitor.visit(leaf);
            }
        };
    }

    public Tree<E> branch(E value, Tree<E>... subtrees){ //1
        return new Tree<E>(){
            @Override
            public <R> R accept(TreeVisitor<E, R> visitor) {
                return visitor.visit(value, subtrees);
            }
        };
    }

}

//1 ,我收到了警告:

类型安全:通过varargs参数子树的潜在堆污染

如何检查我的代码是否真的安全?

2 回答

  • 1

    我如何检查我的代码是否真的安全?

    如果访问者只依赖于 subtrees 的元素是 Tree<E> ,并且不依赖于 subtreesTree<E>[] 的事实,那么这是安全的 . 如果是这种情况,那么您应该使用 @SafeVarargs 注释 visit 方法 .

  • 1

    关于泛型和不可再生类型的Java Tutorial涵盖了您的问题

    当参数化类型的变量引用不是该参数化类型的对象时,会发生堆污染


    当编译器遇到varargs方法时,它会将varargs形式参数转换为数组 . 但是,Java编程语言不允许创建参数化类型的数组 . 在方法ArrayBuilder.addToList中,编译器将varargs形式参数T ...元素转换为形式参数T []元素,即数组 . 但是,由于类型擦除,编译器会将varargs形式参数转换为Object []元素 . 因此,存在堆污染的可能性 .

相关问题