繁体   English   中英

通用返回类型上的Javac错误

[英]Javac error on Generic return type

听起来好像是对wheel的重新发明,但是我正在尝试实现地图(例如Map<K,V> )。 该类具有一个称为sortedKey()的函数,该函数返回ArrayList<K> 。下面是我的代码的简化版本。 我将调试内联调试的尝试包括在内。

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

看一下Collections.sort的签名:

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

因此,该错误虽然可能会引起混淆,但它是正确的-您无法在任意类型的列表上调用sort; 元素类型必须实现Comparable。

如果将通用参数限制为可比较的,例如:

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

那么对Collections.sort(ret)的调用将按预期成功。

如果没有对通用参数的限制,那么有人可以创建一个键类型像Exception这样不可比的Map ,那么您如何期望差劲的Collections.sort来处理呢? :)

编译器告诉您K可能不是带顺序的类型。 您应该将该类声明为

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

以确保可以将K值与其他K值进行比较。

好吧...您应该提供一个比较器或实现您的K(无论是哪种)类相当的实现。

在实现可比对象的情况下,还应像这样声明类参数以将其限制为仅包含可比对象。

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

在Javadoc中, Collection.sort()的类型必须为

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

换句话说,必须将K声明为Comparable<K>Comparable<? super K> Comparable<? super K>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM