【问题标题】:Method with generics don't accept class as argument具有泛型的方法不接受类作为参数
【发布时间】:2015-05-05 18:55:18
【问题描述】:

我在课堂上学习java,需要对一个双向链表进行排序,我得到了代码,它可以工作,但是当我在我的环境中使用代码时,我收到一个错误:

DoubleLinkedListSort 类型中的方法 sort(DoubleLinkedList) 不适用于参数 (DoubleLinkedList)

这是我在这里得到的课程:https://stackoverflow.com/a/2938529/4611395

刚刚将 List 类更改为我的 DoubleLinkedList 类。 所以,我就用这种方式。

DoubleLinkedList<Item> it = new DoubleLinkedList<Item>();

it = DoubleLinkedListSort.sort( it );

如果我将通用 T 更改为我的类 Item,它可以正常工作。 有谁知道为什么会出现这个问题?我知道它应该可以工作。

谢谢。

编辑:

这是我编辑的 DoubleLinkedListSort

package list;

import list.DoubleLinkedList;

public class DoubleLinkedListSort
{
    private static int depth = 0;

    public static <T extends Comparable<T>> DoubleLinkedList<T> sort( DoubleLinkedList<T> Ts )
    {
        depth++;
        String tabs = getTabs();

        System.out.println( tabs + "Sorting: " + Ts );

        if( Ts.listSize() <= 1 ) 
        {
            depth--;
            return Ts;
        }

        DoubleLinkedList<T> left = new DoubleLinkedList<T>();
        DoubleLinkedList<T> right = new DoubleLinkedList<T>();
        DoubleLinkedList<T> result = new DoubleLinkedList<T>();

        int middle = Ts.listSize() / 2;
        int added = 0;

        for( int i = 0; i < Ts.listSize(); i++ )
        {
            try
            {
                if( added++ < middle )
                    left.insertFirst( Ts.getElementAtPosition( i ) );
                else
                    right.insertFirst( Ts.getElementAtPosition( i ) );
            }
            catch( DoubleLinkedListException d )
            {

            }
        }

        left = sort( left );
        right = sort( right );
        result = merge( left, right );

        System.out.println( tabs + "Sorted to: " + result );

        depth--;
        return result;
    }

    private static <T extends Comparable<T>> DoubleLinkedList<T> merge( DoubleLinkedList<T> left, DoubleLinkedList<T> right ) 
    {
        String tabs = getTabs();
        System.out.println( tabs + "Merging: " + left + " & " + right );

        DoubleLinkedList<T> result = new DoubleLinkedList<T>();

        while( left.listSize() > 0 && right.listSize() > 0 )
        {
            try
            {
                if( left.getElementAtPosition( 0 ).compareTo( right.getElementAtPosition( 0 ) ) < 0 )
                {
                    result.insertLast( left.getElementAtPosition( 0 ) );

                    left.deleteElementAtPosition( 0 );
                }
                else
                {
                    result.insertLast( right.getElementAtPosition( 0 ) );

                    right.deleteElementAtPosition( 0 );
                }
            }
            catch( DoubleLinkedListException d )
            {

            }
        }

        try
        {
            if( left.listSize() > 0 )
            {
                for( int i = 0; i < left.listSize(); i++ )
                {
                    result.insertLast( left.getElementAtPosition( i ) );
                }
            }
            else
            {
                for( int i = 0; i < right.listSize(); i++ )
                {
                    result.insertLast( right.getElementAtPosition( i ) );
                }
            }
        }
        catch( DoubleLinkedListException d )
        {

        }

        return result;
    }

    private static String getTabs()
    {
        StringBuffer sb = new StringBuffer( "" );

        for( int i = 0; i < depth; i++ )
            sb.append( '\t' );

        return sb.toString();
    }
}

编辑 2:

正如Method with generics don't accept class as argumenthttps://stackoverflow.com/a/30061121/4611395 评论的那样,它只是实现了 Comparable 并且有效。

public class Item implements Comparable<Item>
.
.
.
@Override
public int compareTo( Item it )
{
    return this.name.compareTo( it.name );
}

谢谢大家的帮助。

【问题讨论】:

  • Item 需要实现Comparable&lt;Item&gt;
  • 格里菲狗抢走了我的风头。这就是答案。看看你的链接代码: public static > List sort(List list) { ... }
  • 将相关代码放入您的问题中。在这种情况下,相关代码是类声明和方法声明的标题。
  • 请将您正在使用的代码的当前版本复制到此问题中。
  • 您刚刚从一些 Stack Overflow 答案中复制了您的代码?这不会教你太多东西。

标签: java generics


【解决方案1】:

看来您必须在 DoubleLinkedList 类上实现 Comparable。可以关注this example看看如何实现Comparable

【讨论】:

    【解决方案2】:

    你在用这个类吗? http://www.java2s.com/Code/Java/Collections-Data-Structure/DoubleLinkedList.htm

    如果是这样,它没有实现List所以它与方法的签名不兼容

    List<T> sort(List<T> list)
    

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多