Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对列表排序<;?扩展T>;_Java - Fatal编程技术网

Java 如何对列表排序<;?扩展T>;

Java 如何对列表排序<;?扩展T>;,java,Java,我有一张单子 List<? extends T> generics; 列表参见,其中T必须实现可比性 但是,我会将T绑定到一个已知的基类,该基类具有finalcompareTo,以确保在比较苹果和梨时,将它们都视为水果 编辑: 从您的评论中,您可以接受上面的建议,但是实现的另一种选择是编写一个 无论哪种方式,如果你有苹果、梨或橙子,那么我建议创建一个抽象类水果,并根据水果实现Comparable/Comparator——这是比较苹果和梨等的唯一明智的方法——通过所有子类共有的属性

我有一张单子

List<? extends T> generics;
列表参见,其中
T
必须
实现可比性

但是,我会将
T
绑定到一个已知的基类,该基类具有
final
compareTo
,以确保在比较苹果和梨时,将它们都视为水果

编辑: 从您的评论中,您可以接受上面的建议,但是实现的另一种选择是编写一个

无论哪种方式,如果你有苹果、梨或橙子,那么我建议创建一个抽象类水果,并根据水果实现Comparable/Comparator——这是比较苹果和梨等的唯一明智的方法——通过所有子类共有的属性

示例代码:

public abstract class Fruit implements Comparable<Fruit> {

    public abstract String getName();

    public abstract Integer getWeightInGrams();

    @Override
    public final int compareTo(Fruit other)
    {
        return getName().compareTo(other.getName());
    }
}

public class Orange extends Fruit {

    private final Integer weightInGrams;

    public Orange(int weightInGrams)
    {
        this.weightInGrams = weightInGrams;
    }

    @Override
    public String getName()
    {
        return "Orange";
    }

    @Override
    public Integer getWeightInGrams()
    {
        return weightInGrams;
    }
}


//Or just using comparators (in which case Fruit does not need to implement Comparable):

public class FruitWeightComparator implements Comparator<Fruit> {

    @Override
    public int compare(Fruit o1, Fruit o2)
    {
        return o1.getWeightInGrams().compareTo(o2.getWeightInGrams());
    }
}


public class FruitNameComparator implements Comparator<Fruit> {

    @Override
    public int compare(Fruit o1, Fruit o2)
    {
        return o1.getName().compareTo(o2.getName());
    }
}
公共抽象类{
公共抽象字符串getName();
公共抽象整数getWeightInGrams();
@凌驾
公共最终国际比较(水果其他)
{
返回getName().compareTo(other.getName());
}
}
公共级橙汁{
私有最终整数权重;
公共橙(国际标准)
{
this.weightInGrams=weightInGrams;
}
@凌驾
公共字符串getName()
{
返回“橙色”;
}
@凌驾
公共整数getWeightInGrams()
{
返回加权平均数;
}
}
//或者仅使用比较器(在这种情况下,水果不需要实现可比性):
公共类Comparator实现Comparator{
@凌驾
公共整数比较(水果o1,水果o2)
{
返回o1.getWeightInGrams().compareTo(o2.getWeightInGrams());
}
}
公共类FructNameComparator实现了Comparator{
@凌驾
公共整数比较(水果o1,水果o2)
{
返回o1.getName().compareTo(o2.getName());
}
}
我们该怎么分类呢


所有元素必须相互可比,即
Collections.sort(泛型)?您希望如何比较列表中的对象?如果列表中有苹果、桔子或水果类型的梨,我想知道在我们的比较代码中进行比较的可能方法。这是采访中提出的。他们没有提供是否实施可比性的细节。名单上可能有苹果、梨或桔子。我们如何编写比较器代码呢?非常感谢您的详细解释。所以,若我们实现比较器,我们只能检查基类变量。如果(苹果的o1实例和苹果的o2实例){return compare o1.get().compareTo(o2.get)}这里有真正的用例吗?我不知道当苹果的o1实例和香蕉的o2实例出现时,你会怎么做。不管怎样,你都想避免类型内省(即基于接收到的类型的不同行为)。实际上,我试图弄清楚,当我们不知道列表中的子类详细信息时,有没有办法通过子类变量进行排序。我的意思是,如果我们得到一个列表,这是没有意义的-你不能比较苹果和梨的特点,只存在于苹果。如果你能提供一个真实的用例,我们可能会找到一个解决方案,但是一个通用的“我如何比较苹果和梨?”问题只能得到一个通用/常识性的答案“你不能”。对不起,请分享示例代码,以了解更多关于第二种解释的信息