使用特定类型扩展 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;
}
}
我是 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;
}
}