gpt4 book ai didi

java - 泛型类中的静态最终变量导致未检查和原始类型警告

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:20 26 4
gpt4 key购买 nike

在泛型类中使用 static final 变量是设计缺陷吗?考虑下面的类,所有对 Node.SOIL 的引用都会引起警告。解决这个问题的好方法是什么?

public class Node<E> {

private static int nodeCounter = 0;

@SuppressWarnings({ "unchecked", "rawtypes" })
public static final Node SOIL = new Node(null, null); // <-- HERE
public static void resetSOIL(){
SOIL.children = null; // <-- HERE
}

private Node<E> parent;
private Set<Node<E>> children;

protected Set<Node<E>> isomorphs;
private E data;
private int id;

public Node(Node<E> parent, E data){
this.parent = parent;
this.data = data;
this.id = ++nodeCounter;

}

public boolean isRoot(){
return (this.getParent() == SOIL);
}

// utility methods
....
}

最佳答案

你已经定义了一个类型 Node<E>它代表 E 树中的一个节点。例如,Node<Integer>是整数树中的一个节点,Node<String>是字符串树中的一个节点。

现在你想要一个变量SOIL包含这些不同类型的各种树的所有根(呵呵,土壤,我现在明白了)。暂时搁置静态字段问题。 SOIL的类应该是什么是?换句话说,我们如何声明和创建 SOIL实例?

Node</*something1*/> SOIL = new Node</*something2*/>(null, null);

SOIL将有 child Node<Integer>Node<String>那么它必须类似于 Node<?>Node<Object> .您不能使用通配符类型参数实例化一个对象,所以您能做的最好的事情是这样的:

Node<?> SOIL = new Node<Object>(null, null);

(如果您使用 Java 7 菱形结构 new Node<>(...),在这种情况下它最终会使用 Object。)

问题是,这仍然不起作用。的方式Node<E>类型被定义为 E 的同质树。但是 SOIL 的一个子树是整数树,另一个子树是字符串树,所以 SOIL想成为一棵异构树。因此,SOIL不能是 Node<E>对于任何 E .

至少,不是以类型安全的方式。您可以编写代码来执行此操作,但您必须添加一些转换,并且您会收到未经检查的警告。这些警告会告诉您这种方法不起作用。例如,考虑一些采用 Node<E> 的代码。并对其所有 sibling (即其 parent 的其他 child )进行操作。一些代码使用了 Node<Integer>可以调用它并以一堆 Node<String> 的实例结束并开始 throw ClassCastExceptions .

您可以考虑制作 SOIL一个Set<Node<?>>而不是让它成为所 Root过的 parent 。您可以在某处将其设为静态字段,但将其设为私有(private)。

关于java - 泛型类中的静态最终变量导致未检查和原始类型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com