我试图编写一个泛型类来对任意类型的数组进行排序。
第一个排序函数对任何类型的数组进行排序。工作很好。
在第二个排序函数中,我传递了list并尝试将其转换为数组来使用第一个排序函数。但是,当我试图将list转换为泛型类中的数组时,它会引发意外的类型错误。
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Sort<T extends Comparable>{
//public T l;
T tmp;
public void sort(T[] l){
for(int i=0;i<l.length;i++){
for(int j=i+1;j<l.length;j++){
if(l[i].compareTo(l[j])>0){
tmp=l[i];
l[i]=l[j];
l[j]=tmp;
}
}
}
System.out.println( Arrays.asList(l));
}
public <T extends Comparable> void sort(List<T> l){
T[] array = (T[]) new Object[l.size()];
sort(l.toArray(T[] array));
// System.out.println(l);
}
public static void main(String[] args){
Integer[] i={2,4,1,5,3};
List<String> l = Arrays.asList("c","d","a","e","b");
Sort s=new Sort();
//String[] j=l.toArray(new String[l.size()]);
s.sort(i);
s.sort(l);
}
}
发布于 2016-12-04 01:02:10
正如n247s所建议的,如果您希望类和方法之间具有一致性,那么它们应该使用相同的参数化类型。
它提出了另一个问题:如果你这样做,你不应该混合橘子和香蕉,因为否则你的那类可能会产生意想不到的结果。假设您在数组或列表中添加了一个可比较对象的组合,这些对象不是设计用来在它们之间进行比较的:String
、Boolean
、CustomClassWhichIsComparable
。
此外,在将列表转换为数组的方法中,希望在Comparable
数组中分配一个Comparable
数组。但是您不能这样做,因为所有Object
实例都不一定是Comparable
实例。
public <T extends Comparable> void sort(List<T> l){
T[] array = (T[]) new Object[l.size()];
sort(l.toArray(T[] array));
}
你可以这样做:
public void sort(List<T> l) {
T[] array = (T[]) new Comparable[l.size()];
sort(l.toArray(array));
}
在这两种情况下,您都会有警告,但也没有例外。
下面是建议修改的类:
public class Sort<T extends Comparable<T>> {
T tmp;
public void sort(T[] l) {
for (int i = 0; i < l.length; i++) {
for (int j = i + 1; j < l.length; j++) {
if (l[i].compareTo(l[j]) > 0) {
tmp = l[i];
l[i] = l[j];
l[j] = tmp;
}
}
}
System.out.println(Arrays.asList(l));
}
public void sort(List<T> l) {
T[] array = (T[]) new Comparable[l.size()];
sort(l.toArray(array));
}
public static void main(String[] args) {
Integer[] i = { 2, 4, 1, 5, 3 };
Sort<Integer> sortInt = new Sort<Integer>();
sortInt.sort(i);
Sort<String> sortString = new Sort<String>();
List<String> l = Arrays.asList("c", "d", "a", "e", "b");
sortString.sort(l);
}
}
发布于 2016-12-04 00:19:45
这是因为您没有在类级别上暗示任何泛型参数(例如Sort(<)String(>) s = new Sort<>()
),这意味着您将不能将它与整数数组一起使用(如果您使用Integer
作为泛型类型,则反之亦然)。我要做的是在方法级别上使用泛型参数。(与第二种方法一样)
public class Sort {
public <T extends Comparable> void sort(T[] l){
T tmp;
for(int i=0;i<l.length;i++){
for(int j=i+1;j<l.length;j++){
if(l[i].compareTo(l[j])>0){
tmp=l[i];
l[i]=l[j];
l[j]=tmp;
}
}
}
System.out.println( Arrays.asList(l));
}
public <T extends Comparable> void sort(List<T> l){
T[] array = (T[]) new Object[l.size()];
sort(l.toArray(T[] array));
// System.out.println(l);
}
发布于 2016-12-04 00:19:22
问题是第二个<T extends Comparable>
方法中的sort
。此类型T
正在隐藏类类型T
。
您可以重命名它,但是由于您没有在第一个方法中返回某些内容,所以最快的解决方法就是忽略它,这样编译器就会再次高兴起来。从代码开始,这将转换为如下内容:
public void sort(List<T> l){
T[] array = (T[]) new Object[l.size()];
sort(array);
}
https://stackoverflow.com/questions/40956596
复制相似问题