Java 在3个不同类别上使用可比较的

Java 在3个不同类别上使用可比较的,java,object,comparable,Java,Object,Comparable,我试图实现一个函数,返回给定可比较泛型列表的最大对象 我有3个类,我已经实现了它们的compareTo方法,如果这个大于其他,则返回1,如果这个小于其他,则返回1,如果它们相等,则返回0 现在我的问题是理解如何使用通用输入可比列表 这是我函数的签名,以及迄今为止我编写的拒绝在我身上使用的代码: public static Comparable<?> getMax(List<Comparable<?>> ls) { LinkedList<Compa

我试图实现一个函数,返回给定可比较泛型列表的最大对象

我有3个类,我已经实现了它们的compareTo方法,如果这个大于其他,则返回1,如果这个小于其他,则返回1,如果它们相等,则返回0

现在我的问题是理解如何使用通用输入可比列表

这是我函数的签名,以及迄今为止我编写的拒绝在我身上使用的代码:

public static Comparable<?> getMax(List<Comparable<?>> ls) {
    LinkedList<Comparable<?>> tmpComp = new LinkedList<Comparable<?>>();
    for (Comparable<?> c : ls)
        tmpComp.add(c);
    Comparable<?> maxObj = tmpComp.get(0);
    for (Comparable<?> c : tmpComp)
        if (c.compareTo(maxObj) > 0)
            m = c;
    return m;
}
我正在编写一个系统,其中有用户,还有广告。用户和广告都是有利润字段的类,我在比较中所做的就是比较这两个类中哪一个利润更多,然后根据它返回正确的值。第三类通过另一个字段进行比较,该字段也是一个int,表示任务的int级别

另外,if语句给出的错误类型不适用于参数

有什么线索吗


提前谢谢

阅读您的评论,我建议您将您的模型重新设计为:

interface ProfitGenerating {
    double getProfit();
}

class User implements ProfitGenerating {
    ...
}

class Advert implements ProfitGenerating {
    ...
}

List<ProfitGenerating> profits = ...;

Optional<ProfitGenerating> maxProfit = profits.stream()
    .max(Comparator.comparingDouble(ProfitGenerating::getProfit));

答案是Mạ新罕布什尔州奎伊ế唐古伊ễn是好的。但这并不能解释你有多个潜在类型T的情况,这似乎就是你的情况

因此,在这种情况下,只需用一个类包装您的各种类,然后使用他的解决方案

如果您有一个用户类和一个广告类,那么创建一个包装器,如下所示:

class ProfitMaker implements Comparable<ProfitMaker> {
    User user;
    Ad ad;

    public int compare(ProfitMaker p) {
         //check my profit and compare with profit of p
    }
}
当从M中指定getMax时,将该类用作Tạ新罕布什尔州奎伊ế唐古伊ễn

或者,使用一个接口

 interface ProfitMaker extends Comparable<ProfitMaker> {
      int getProfit();
 }

使您的用户和Ad类都实现该接口,并将该接口作为T以及来自M的getMax方法ạ新罕布什尔州奎伊ế唐古伊ễn、

您的三门课程必须具有可比性。为此,他们需要实现可比较的SomeX,其中SomeX是他们最低的通用超类。在最坏的情况下,SomeX是对象

如果是这种情况,您可以简单地执行以下操作:

ls.stream().max(Comparator.naturalOrder())
或者,您可以在Comparator中捕获比较语义,然后执行以下操作,而不是强制类实现Comparable:

ls.stream().max(comparator)
对于类型的顺序不是很自然或者可能有不同的顺序的情况,使用比较器更好。我认为这里就是这种情况,因为您实际上比较了不同类型的实例。很难说这些实例的某些顺序是自然的,因为它们甚至不属于一种类型

如果您根据实例共享的某些属性(如int getProfit)来比较实例,那么创建一个公共接口(如Profile)是有意义的。然后你可以做:

ls.stream().max(Comparator.comparintInt(Profitable::getProfit))
请注意,如果对私有类型进行比较,则应使用comparingit/comparingLong/comparingDouble而不是comparing,以避免不必要的装箱和取消装箱

如果由于某种原因无法创建和实现像Profile这样的通用接口,那么仍然可以使用Comparingit和likes。你会有一个更丑的lambda:

ls.stream().max(Comparator.comparintInt(l -> {
    if (l instanceof Ad) { return ((Ad) l).getProfit(); }
    else if (l instanceof Ransom) { return ((Ransom) l).getProfit(); }
    // ...
    else { throw new IllegalArgumentException(...); }
}))

给我们看三节课;告诉我们应该如何比较它们。这里的问题是每次使用Compariable时,Compariable可能是一种完全不同的类型。没有泛型Compariable,只有Compariable to objects of The specific type。Compariable并不意味着可以与任何类型进行比较,它意味着可以与某些未知类型进行比较。@ElliottFrisch不幸的是,这些类在这里发布的时间太长了,但我将尝试提供更多信息。我正在编写一个系统,其中有用户,还有广告。用户和广告都是有利润字段的类,我在比较中所做的就是比较这两个类中哪一个利润更多,然后根据它返回正确的值。第三类通过另一个字段进行比较,该字段也是一个int,表示任务的int级别。