gpt4 book ai didi

java - Java 的泛型是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 03:42:01 28 4
gpt4 key购买 nike

谁能帮我理解 Java 的泛型是如何工作的?我理解它的概念。但对于这个具体的代码示例,我并不清楚编译器的错误消息。

示例代码:测试类

// Test code 
public class A < ListType extends Comparable < ListType >> {
// To make the instance variable y
public int y;
// To make the instance variable s
public String s;

//Constructor Method
public A(int requiredY, String requiredS) {
y = requiredY;
s = requiredS;
}

more code here...
}

然后在另一个类(class)我写了

List <A> a = new ArrayList<A>();
more code here...
Collections.sort(a)

我收到的错误消息是

test.java:20: error: no suitable method found for sort(List<A>)
Collections.sort(a);
^
method Collections.<T#1>sort(List<T#1>) is not applicable
(inference variable T#1 has incompatible bounds
equality constraints: A
upper bounds: Comparable<? super T#1>)
method Collections.<T#2>sort(List<T#2>,Comparator<? super T#2>) is not applicable
(cannot infer type-variable(s) T#2
(actual and formal argument lists differ in length))

其中 T#1、T#2 是类型变量:

T#1 extends Comparable<? super T#1> declared in method <T#1>sort(List<T#1>)
T#2 extends Object declared in method <T#2>sort(List<T#2>,Comparator<? super T#2>)

我不明白为什么编译器会提示类型参数。 Collection 不应该起作用吗?因为类型参数都是相互比较的。

最佳答案

要么您为了隐藏类名而写错了问题,要么您错误地表示了泛型。

如果你想做的是创建一个可以排序的类,你可以实现 Comparable正如其他人所建议的那样,属于 A 类。

public class A < ListType extends Comparable < ListType >> {
...
}

上面的代码需要 class A接受扩展/实现 Comparable 的类,并使用ListType作为其类型删除。因为您没有展示如何使用 ListType绑定(bind)类型,我认为这不是你想要的。

通常,泛型用于绑定(bind)可以在类中使用的参数类型,以便在编译时提供类型安全的操作。

import java.lang.Override;
public class A <ListType extends Comparable<ListType>>{
ListType lt;
A(ListType b){
this.lt = b;
}
static class B implements Comparable<B>{
B(){};
@Override
public int compareTo(B b){
return 0;
}
}
static class C implements Comparable<B>{
C(){};
@Override
public int compareTo(B c){
return 0;
}
}


public static void main(String[] args){
A<B> a = new A<B>(new B()); //OK
A<C> _a = new A<C>(new C()); //ERROR: is not within bound
System.out.println("");
}
}

因为class C没有实现 Comparable类本身,你不能传递 class C变量为 class A构造函数。如果您想创建一个接受任何扩展 Comparable 的类的类型,您可以使用通配符 ? .

public class A <ListType extends Comparable<?>>

或使用单个大写字母作为类型以获得更好的代码样式

public class A <T extends Comparable<?>>

关于java - Java 的泛型是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36733032/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com