【问题标题】:Implementing a LinkedList of a specific class, instead of generic type实现特定类的 LinkedList,而不是泛型类型
【发布时间】:2013-03-30 21:13:41
【问题描述】:

我有一个简单的问题。

我正在使用我自己定义的链接节点定义一个类,作为嵌套类。

我只想将此节点用于字符串的 ArrayLists 的节点,而不是用于泛型类型。

我为泛型类型 T 定义了 Node,即 HNode,但我想在这个使用 ArrayList 方法的 Node 类上添加方法。例如,

    public void forward(int n) { //return boolean??
        HNode<T> targetNode;
        for(int i=0; i<n; i++) {
            targetNode = this._next;
        }
        targetNode._datum.add(this._datum.remove(this._datum.size()-1));
    }

在我的 Node 类中。

它一直警告说方法 size() 未定义类型 T,这就是为什么我正在考虑将类定义更改为 String 的 ArrayList 的节点。

(第一个问题是这样的:) 这是正确的方法,还是有更好的方法? 或者我可以忽略警告,只要我使用

另一个问题是这个。 我声明了变量 targetNode,并在 for 循环中分配了它。 但是,它会引发需要分配 targetNode 的警告。

    public void forward(int n) { //return boolean??
        HNode<T> targetNode = this;
        for(int i=0; i<n; i++) {
            targetNode = targetNode._next;
        }
        targetNode._datum.add(this._datum.remove(this._datum.size()-1));

这可能是一个更好的选择吗?

谢谢!!

【问题讨论】:

    标签: java generics data-structures linked-list


    【解决方案1】:

    有更好的方法!

    由于您希望使用Arraylist.size() 方法,我建议您将节点(和包含类)设置为Collection 接口的类型。

    Collection 接口保证对象将实现.size() 方法,这将消除您的编译错误。

    Arraylist继承自Collection如下:
    Collection--&gt;AbstractList--&gt;Arraylist

    在您的班级中使用Collection 代替通用的T

    HNode<Collection> targetNode;
    

    这将允许您的类处理所有实现Collection 接口的类,这是一个广泛的类组。与将整个类提交给 Arraylist

    【讨论】:

    • 我定义了我的类私有类 HNode {我猜这可能有用??
    • @user25409 像这样定义私有类:HNode&lt;Collection&gt;
    【解决方案2】:

    “我只想将此节点用于String的ArrayLists的节点,而不是用于泛型”

    然后像这样创建你的类型,删除泛型,使用:HNode 而不是HNode&lt;T&gt;

    并创建Arraylist&lt;String&gt; 类型的字段。

    【讨论】:

    • 你是说HNode>?这不起作用,这就是我问这个问题的原因。
    • 抱歉还在编辑我的答案,现在更好了:),这符合您的需要吗?
    【解决方案3】:

    为了能够使用 List 接口的方法,你只需要替换

    HNode<T> 
    

    HNode<List>
    

    出现警告“需要分配目标节点”是因为如果 n=0,您的 for 循环将不会执行。这就是可能未分配 targetNode 的原因。这就是为什么你应该添加范围检查,否则你可能会在这一行得到 NullPointerException

    targetNode._datum.add(this._datum.remove(this._datum.size()-1));
    

    编辑: 而且看起来你的最后一行在逻辑上是不正确的。 remove() 方法返回操作的结果(布尔值),而不是被删除的对象本身。您需要在删除之前显式获取此元素,或者只需将您的集合更改为 LinkedList 并调用 removeLast() 方法。

    【讨论】:

    • 回复 'Edit:' :我检查了 Javadoc,有两种删除方法。 remove() 返回布尔值,remove(int index) 返回被删除的对象。
    • 是的,我混淆了浏览器选项卡并查看了 Collection 接口 javadoc 而不是 List。对不起这个错误。但这就是你应该使用 List 接口的原因,而不是 @awashburn 建议的 Collection。
    猜你喜欢
    • 2011-08-23
    • 2020-04-17
    • 2012-02-27
    • 2013-08-16
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多