Java 将对象强制转换为泛型(或将内部类变量存储为泛型)

Java 将对象强制转换为泛型(或将内部类变量存储为泛型),java,generics,casting,inner-classes,Java,Generics,Casting,Inner Classes,当我试图从对象强制转换为泛型类型时,会收到警告。 由于内部节点类上的底层数据结构是数组,因此无法使节点成为泛型,因为无法创建泛型数组,因此我的val参数必须是一个对象 有没有解决办法或更好的方法?我可以压制警告,但我不确定这是否会产生我应该担心的后果 我还制作了不同的树来实现MyTreeI,它们都有不同的节点结构(所以我不能只制作一个实际的节点类(这会起作用吗?我不知道..可能)) 此处的Ex代码: public class MyTree<E> implements MyTreeI&

当我试图从对象强制转换为泛型类型时,会收到警告。 由于内部节点类上的底层数据结构是数组,因此无法使节点成为泛型,因为无法创建泛型数组,因此我的
val
参数必须是一个对象

有没有解决办法或更好的方法?我可以压制警告,但我不确定这是否会产生我应该担心的后果

我还制作了不同的树来实现MyTreeI,它们都有不同的节点结构(所以我不能只制作一个实际的节点类(这会起作用吗?我不知道..可能))

此处的Ex代码:

public class MyTree<E> implements MyTreeI<E> {
    private Node root;      // root of tree


    private static class Node {
        private Object val;
        private Node[] children = new Node[2];
    }

    public MyTree() {
    }


    @Override
    public E get(String key) {
        Node x = getNode(key); // helper function, assume it returns node in question
        return (E) x.val;
    }
}
公共类MyTree实现MyTreeI{
私有节点根;//树的根
私有静态类节点{
私有对象val;
私有节点[]子节点=新节点[2];
}
公共MyTree(){
}
@凌驾
公共E-get(字符串键){
Node x=getNode(key);//helper函数,假设它返回有问题的节点
返回(E)x.val;
}
}
我无法使节点成为泛型,因为我无法创建泛型数组

使
节点
通用不会阻止您使用
节点
的数组。无法创建
新节点[…]
,true;但是您可以创建
新节点[…]
新节点[…]
并将其强制转换为
节点[…]
,或者只需将
子节点的类型更改为
节点[]
。有很多可能的方法可以做到这一点

public class MyTree<E> implements MyTreeI<E> {
    private Node<E> root;      // root of tree


    private static class Node<E> {
        private E val;
        private Node<E>[] children = (Node<E>[])new Node<?>[2];
    }

    public MyTree() {
    }


    @Override
    public E get(String key) {
        Node<E> x = getNode(key); // helper function, assume it returns node in question
        return x.val;
    }
}
公共类MyTree实现MyTreeI{
私有节点根;//树的根
私有静态类节点{
私人E val;
私有节点[]子节点=(节点[])新节点[2];
}
公共MyTree(){
}
@凌驾
公共E-get(字符串键){
Node x=getNode(key);//helper函数,假设它返回有问题的节点
返回x.val;
}
}

为什么不能让节点使用
E
作为
val
的类型,让子节点使用
列表而不是数组?我不能让E作为val的类型,因为我不能从静态引用中引用非静态类型。。。至于让它成为一个列表-我有很多其他代码已经利用了它是一个数组的事实-我可以将其全部更改为使用列表,但我更倾向于保持原样并抑制警告,而不是重做所有代码-或者这是一个坏主意吗?节点类也必须是泛型的:
私有静态类节点
,根节点的类型应为
节点
,以及
x
getNode()
应该返回一个
节点
,等等。你当然可以使用数组,但是你会有类型安全警告。这样做对我来说并不理想,因为我正在实现一个不调用泛型返回的接口;我正在创建不同的树,并不是所有节点的格式都相同,所以我只想返回一个元素,而不是Nodeoh wait,这是哑的,你是说在我的helper函数中。我明白了-我还是宁愿在最后的手段下做这件事,因为我必须修改一段相当好的代码,所以如果有任何方法,我可以用一个数组来做这件事,那将是令人惊讶的,但如果没有,我可能会选择列表路线