我可以使用 <T implements Comparable> 还是只使用 <Comparable>
Can I use <T implements Comparable> or just <Comparable>
我可以使用 <T implements ..>
代替 <T extends...>
吗?
我不能在没有 extends/implements 的情况下使用 <Comparable>
吗?
为什么或为什么不?
class SomeClass
{
public static <T extends Comparable> somemethod(T[] a)
{
// do stuff
}
}
Comparable
是一个 generic 类型(和一个 interface)所以你必须 extend 并且您不能 实现 - 这就是 Java 泛型的工作方式,而且您的方法缺少 return 签名。你可以使用 Lower Bounded Wildcard 比如
public static <T extends Comparable<? super T>> T[] somemethod(T... a) {
Arrays.sort(a);
return a;
}
这应该会像您预期的那样工作1。例如,
public static void main(String[] args) {
System.out.println(Arrays.toString(somemethod(4, 3, 1, 2)));
System.out.println(Arrays.toString(somemethod(new Integer[] { 8, 7, 6, 5 })));
}
产出
[1, 2, 3, 4]
[5, 6, 7, 8]
1这里是一个排序的variadic (varargs) function但是如果你喜欢也可以使用数组
我可以使用 <T implements ..>
代替 <T extends...>
吗?
我不能在没有 extends/implements 的情况下使用 <Comparable>
吗?
为什么或为什么不?
class SomeClass
{
public static <T extends Comparable> somemethod(T[] a)
{
// do stuff
}
}
Comparable
是一个 generic 类型(和一个 interface)所以你必须 extend 并且您不能 实现 - 这就是 Java 泛型的工作方式,而且您的方法缺少 return 签名。你可以使用 Lower Bounded Wildcard 比如
public static <T extends Comparable<? super T>> T[] somemethod(T... a) {
Arrays.sort(a);
return a;
}
这应该会像您预期的那样工作1。例如,
public static void main(String[] args) {
System.out.println(Arrays.toString(somemethod(4, 3, 1, 2)));
System.out.println(Arrays.toString(somemethod(new Integer[] { 8, 7, 6, 5 })));
}
产出
[1, 2, 3, 4]
[5, 6, 7, 8]
1这里是一个排序的variadic (varargs) function但是如果你喜欢也可以使用数组