2012-06-27 126 views
2

这可能听起来像重新创建轮子,但我试图实现一个地图(如Map<K,V>)。该类有一个叫做sortedKey()的函数,它返回一个ArrayList<K>我的代码的精简版本如下。我已经包括了我的尝试,作为评论内联调试。通用返回类型Javac错误

import java.util.ArrayList; 
import java.util.Collections; 

public class Map<K,V> { 
    private ArrayList<Pair<K,V> > array; //Pair<K,V> is a class defined in another file. 

    //returns an ArrayList(of proper type) of keys (ie, the desired function) 
    public ArrayList<K> sortedKeys(){ 
     ArrayList<K> ret = keys(); //another method defined inside same class 

     K s = ""; // error: no suitable method found for sort(ArrayList<K>) 
     Collections.sort(new ArrayList<String>()); //Works just fine.. 
     Collections.sort(ret); //Same error here.. 
     return ret; 
    } 
} 

任何想法为什么这个错误显示?根据用于创建类的类型变量,我是否可以不使用通用返回类型?还是我必须做其他事情才能达到预期的效果?

感谢和道歉,如果这个问题已经被问

接cajetan

+1

这条线真的是要说'K s =“”;'?这看起来是错误的,特别是在注释中的错误不匹配(即提到'sort'调用)。 –

回答

3

看一看的Collections.sort签名:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

所以错误,尽管它可能是混乱的,是正确的 - 你不能任意类型的列表上的呼叫进行排序;元素类型必须实现Comparable。

如果限制你的泛型参数具有可比性,如:

public class Map<K extends Comparable<K>,V> { 
    ... 

然后像您期望的调用Collections.sort(ret)会成功。

没有这个通用参数的限制,有人可以创建一个Map,其键值类型如Exception那样不可比 - 然后您如何期待可怜的Collections.sort来处理? :)

+0

非常感谢,解决了我的问题:) –

+0

没问题。在设计泛型类时,我经常会经历类似的步骤 - 使用无界通配符,然后才意识到它对于具有某些基本属性(如“Serializable”,“Comparable”或“Closeable”等)的类才有意义。能够通过类型系统以及Javadocs表达这一点很好。 –

+0

为获得最佳效果,请使用'K extends Comparable ' – newacct

0

嗯......你应该提供一个比较或说明您的K实现可比(无论它可能是)类。

在实现可比较的情况下,还声明类似这样的参数以限制它仅包含可比对象。

public class Map<K extends Comparable<K>, V> 
+0

为获得最佳效果,请使用'K extends Comparable ' – newacct

0

Collection.sort()的类型必须是

public static <T extends Comparable<? super T>> void sort(List<T> list) 

换言之的Javadoc,K都将被声明为Comparable<K>Comparable<? super K>

2

编译器会提醒您K可能不是一种有序的类型。你应该声明类为

public class Map<K extends Comparable<K>, V> { 

保证K值可以相对于其他K值。

+0

非常感谢,解决了我的问题:) –

+0

为获得最佳效果,请使用'K extends Comparable ' – newacct

+0

理论上是正确的,但我从未见过它实际上会生成实际代码中的差异。 –