如何获得Comparator.comparing以正确推断类型参数? [英] How do I get Comparator.comparing to correctly infer type parameters?

查看:297
本文介绍了如何获得Comparator.comparing以正确推断类型参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下课程:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang3.tuple.Pair;

public class Sorter {
    private List<Pair<Long, NameDTO>> dtoPairs = new ArrayList<>();

    public Sorter() {
        Comparator<Pair<Long, NameDTO>> bySize = Comparator.comparing(Pair::getLeft);
        Comparator<Pair<Long, NameDTO>> byName = Comparator.comparing(p -> p.getRight().getName());
        dtoPairs.sort(bySize.reversed().thenComparing(byName));
    }
}

class NameDTO {
    private String name;
    public String getName() {
        return name;
    }
}

此编译没有问题.但是,如果我尝试内联这样的变量:

This compiles with no problems. However, if I try to inline the variables like this:

 dtoPairs.sort(Comparator.comparing(Pair::getLeft).reversed().thenComparing(Comparator.comparing(p -> p.getRight().getName())));

我收到以下编译错误:

Sorter.java:[18,51] incompatible types: cannot infer type-variable(s) T,U
    (argument mismatch; invalid method reference
      method getLeft in class org.apache.commons.lang3.tuple.Pair<L,R> cannot be applied to given types
        required: no arguments
        found: java.lang.Object
        reason: actual and formal argument lists differ in length)

如何编写此表达式以使Java正确理解参数?

How can I write this expression to make Java understand the parameters correctly?

推荐答案

您需要告诉编译器通用参数的类型. 试试这个:

You need to tell the compiler the type of the generic parameters. Try this:

dtoPairs.sort(
    Comparator.comparing(Pair<Long, NameDTO>::getLeft)
    .reversed()
    .thenComparing(Comparator.comparing(p -> p.getRight().getName())));

这篇关于如何获得Comparator.comparing以正确推断类型参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆