使用特定类型扩展 java 中的泛型 class

Extend a generic class in java with a particular type

我是 java 的新手,我刚刚发现了泛型。在我测试这段代码之前,我以为我理解了原理。 我想创建一个 class SortedListOfStrings,扩展 ArrayList 以在列表中按词法顺序插入一个元素。

public class SortedListOfStrings<String> extends ArrayList<String> {
    
    public boolean add(String s) {
        boolean done = false;
        int i;
        for(i=0; i<this.size(); i++) {
            if(get(i).compareTo(s) > 0) {
                this.add(i,s);
                done = true;
            }
        }
        if(!done) {
            this.add(i, s);
        }
        return true;
    }
}

但我发现了这个错误:方法 compareTo(String) 未定义类型字符串 SortedListOfStrings.java 第 11 行

谁能解释一下为什么我有它或者我做错了什么?

谢谢

泛型 classes 允许您创建一个 class,它将适用于 <> 尖括号中指定的任何类型(Java 允许您限制哪些类型可以指定,但那是另一个时间的讨论)。这意味着在 class 定义中,您在尖括号中指定的类型是任意类型参数。

在这种情况下,您是说任意类型参数被命名为 String。这个 String 只是另一种类型的 stand-in。因为您将 String 指定为类型参数的名称,所以在此 class 上下文中的 String 只是一个可以是任何类型的 stand-in。通常,泛型类型参数以单个大写字母命名(如 T)以避免与现有类型冲突。您的 String 类型正在覆盖(在 non-programming 这个词的含义中)您习惯的 java.lang.String 类型。因为 class 中的 String 是通用的,所以无法保证它是 stand-in 的类型具有 compareTo 方法,因此会出现错误。

extends关键字基本上意味着你的class继承了另一个class的所有方法。您可能需要覆盖(这次我指的是编程意义上的“覆盖”)其他 class 中的一些方法,这意味着您提供自己的实现,以使其正常工作。

我不认为你试图用这个 class 做的事情适合泛型类型参数,因为从它的名字来看,你不希望它是泛型的。您希望它仅适用于字符串。

您可能想做这样的事情:

public class SortedListOfStrings {
    private ArrayList<String> list = ArrayList<>();
    
    public void add(String s) {
        int i = 0;
        while (i < list.size() && s.compareTo(list.get(i)) < 0)
            ++i;

        list.add(i, s);

        return;
    }
}