【问题标题】:Casting an object to a generic (or storing inner class variable as generic)将对象转换为泛型(或将内部类变量存储为泛型)
【发布时间】:2013-12-09 08:00:10
【问题描述】:

当我尝试从 Object 强制转换为泛型类型时收到警告。 由于我的内部 Node 类上的底层数据结构是一个数组,因此我无法将 Node 设为泛型,因为我无法创建泛型数组,因此我的 val 参数必须是一个 Object。

是否有任何解决方法或更好的方法?我可以直接取消警告,但我不确定这是否会产生我应该关注的后果。

我也在制作不同的树来实现 MyTreeI 并且都将具有不同的节点结构(所以我不能只制作一个实际的节点类(这甚至可以工作吗?我不知道..也许))

此处为示例代码:

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;
    }
}

【问题讨论】:

  • 为什么不能让 Node 使用 E 作为 val 的类型,而子节点使用 List&lt;Node&gt;,而不是数组?
  • 我无法将 E 设为 val 的类型,因为我无法从静态引用中引用非静态类型...至于将其设为 List - 我有很多其他已经利用它是一个数组这一事实的代码 - 我可以将它全部更改为使用列表,但我更倾向于保持原样并抑制警告而不是重做所有代码 - 或者是一个坏主意?
  • Node 类也必须是通用的:private static class Node&lt;E&gt;,并且根的类型应该是 Node&lt;E&gt;,以及 xgetNode() 应该返回一个 Node&lt;E&gt; 等。你当然可以使用一个数组,但是你会收到类型安全警告。
  • 这样做对我来说并不理想,因为我正在实现一个不需要通用返回的接口;我创建了不同的树,并非所有节点的格式都相同,所以我只想返回一个 Element 而不是 Node
  • 哦,这太愚蠢了,你的意思是我的辅助函数。我明白了——我仍然宁愿只在万不得已的情况下才这样做,因为我必须修改相当多的代码块,所以如果有任何方法我可以用一个很棒的数组来做到这一点,但如果没有,我可能只是去列表路线

标签: java generics casting inner-classes


【解决方案1】:

我不能让 Node 通用,因为我不能创建通用数组

使Node 泛型不会阻止您使用Node 的数组。你不能创建new Node&lt;E&gt;[...],是的;但是您可以创建new Node&lt;?&gt;[...]new Node[...] 并将其转换为Node&lt;E&gt;[],或者只需将children 的类型更改为Node&lt;?&gt;[]。有很多方法可以做到这一点。

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多