这个问题在这里已有答案:
我有效的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 回答
如果访问者只依赖于
subtrees
的元素是Tree<E>
,并且不依赖于subtrees
是Tree<E>[]
的事实,那么这是安全的 . 如果是这种情况,那么您应该使用@SafeVarargs
注释visit
方法 .关于泛型和不可再生类型的Java Tutorial涵盖了您的问题