Java通用形式参数

Java通用形式参数,java,generics,Java,Generics,我正在实现一个简单的LinkedList类,我希望它使用泛型。类别声明为: public class LinkedList<E> extends AbstractList<E> implements List<E> { 在我看来,如果我从来都不想调用addSorted,那么为什么特定的类应该被限制为实现Comparable的E类呢?或者有一种完全不同的方法来实现这一点,即对实例进行一般模拟?考虑一下,如果您能够在链接列表实例上同时调用add和addSorte

我正在实现一个简单的
LinkedList
类,我希望它使用泛型。类别声明为:

public class LinkedList<E> extends AbstractList<E> implements List<E> {

在我看来,如果我从来都不想调用
addSorted
,那么为什么特定的类应该被限制为实现
Comparable
的E类呢?或者有一种完全不同的方法来实现这一点,即对实例进行一般模拟?

考虑一下,如果您能够在
链接列表
实例上同时调用
add
addSorted
,会发生什么:

LinkedList<String> list = new LinkedList<>();
list.add("c"); list.add("a");
list.addSorted("b");

一般来说,我处理只适用于某些泛型类型的方法的方法是使用一个方法,该方法接受类的实例作为第一个参数,在类的定义之外(或在类的定义之内,但定义为
static
)。这意味着它不是类接口的一部分,因此对于具有不兼容泛型类型的类,它不存在

例如,如果您想添加一个
sort
方法来对
LinkedList
s进行排序,这显然只适用于具有
可比
元素的对象:

static <E extends Comparable<E>> void sort(LinkedList<E> list) {
  // ...
}
静态无效排序(LinkedList列表){
// ...
}
例如:

LinkedList<String> strList = new LinkedList<>();
// ... Add elements.
sort(strList); // OK.

LinkedList<Object> objList = new LinkedList<>();
// ... Add elements.
sort(objList); // Compiler error - Object is not a valid bound.
LinkedList strList=newlinkedlist();
// ... 添加元素。
排序(strList);//好啊
LinkedList objList=新建LinkedList();
// ... 添加元素。
排序(对象列表);//编译器错误-对象不是有效的绑定。

考虑如果您能够在
链接列表
实例上同时调用
add
addSorted
,会发生什么:

LinkedList<String> list = new LinkedList<>();
list.add("c"); list.add("a");
list.addSorted("b");

一般来说,我处理只适用于某些泛型类型的方法的方法是使用一个方法,该方法接受类的实例作为第一个参数,在类的定义之外(或在类的定义之内,但定义为
static
)。这意味着它不是类接口的一部分,因此对于具有不兼容泛型类型的类,它不存在

例如,如果您想添加一个
sort
方法来对
LinkedList
s进行排序,这显然只适用于具有
可比
元素的对象:

static <E extends Comparable<E>> void sort(LinkedList<E> list) {
  // ...
}
静态无效排序(LinkedList列表){
// ...
}
例如:

LinkedList<String> strList = new LinkedList<>();
// ... Add elements.
sort(strList); // OK.

LinkedList<Object> objList = new LinkedList<>();
// ... Add elements.
sort(objList); // Compiler error - Object is not a valid bound.
LinkedList strList=newlinkedlist();
// ... 添加元素。
排序(strList);//好啊
LinkedList objList=新建LinkedList();
// ... 添加元素。
排序(对象列表);//编译器错误-对象不是有效的绑定。

这不是正确的语法。如果
E
是类的类型参数,则它应该是
public void addSorted(E值)
或只是
public void addSorted(E值)
。我们需要更多的信息。如果你不描述问题,我们也不能。你应该提出你的问题。是否存在编译错误?有吗,哪一个?是否存在运行时错误?这不是正确的语法。如果
E
是类的类型参数,则它应该是
public void addSorted(E值)
或只是
public void addSorted(E值)
。我们需要更多的信息。如果你不描述问题,我们也不能。你应该提出你的问题。是否存在编译错误?有吗,哪一个?是否存在运行时错误?响应良好。接下来的几点:假设我想让LinkedList的所有用途都需要Comparable的子类,正确的类声明是:公共类LinkedList扩展AbstractList实现List吗{?这就是我所拥有的,它编译后似乎工作正常。即使列表接口没有提到可比性等等。其次,我想可能(我不会)将“addSorted”改为“addSorted”检测到列表尚未排序,然后先对其排序。布尔值可以跟踪列表是否已排序。1)是的,这是正确的。
声明类型变量及其约束;后续的
仅使用它(就像您只需要
字符串something
来声明它,但
something
来使用它一样)好吧,我想你可以,但它会有点混乱。回答很好。接下来的几点:假设我想让LinkedList的所有用途都需要Comparable的子类,正确的类声明是:公共类LinkedList扩展AbstractList实现List吗{?这就是我所拥有的,它编译后似乎工作正常。即使列表接口没有提到可比性等等。其次,我想可能(我不会)将“addSorted”改为“addSorted”检测到列表尚未排序,然后先对其排序。布尔值可以跟踪列表是否已排序。1)是的,这是正确的。
声明类型变量及其约束;后续的
仅使用它(就像你只需要
字符串something
就可以声明它,但是
something
就可以使用它。)好吧,我想你可以,但它会变得有点混乱。