Java 8 - 使用双冒号语法调用接口的默认方法

bla*_*gae 4 java lambda inheritance java-8

我正在深入研究Java 8创新,我正在尝试调用我在高级接口中实现的默认方法,即使子类重写它也是如此.我可以毫不费力地回到Comparator我的BusinessLogic班级实现一个,但我想知道是否有一些魔法可以让我使用漂亮的新东西::.

码:

public interface IdEntity extends Comparable<IdEntity> {

    int getId();

    @Override
    default int compareTo(IdEntity other) {
        return getId() - other.getId();
    }
}

public class Game implements IdEntity {
    @Override
    public int compareTo(IdEntity o) {
        if (o instanceof Game) {
            Game other = (Game) o;
            int something;
            // logic
            return something;
        }
        return super.compareTo(o);
    }
}

public class BusinessLogic {
    private void sortList(List<? extends IdEntity> list) {
        // for Game, Game::compareTo gets called but I want, in this call only, the default method
        Collections.sort(list, IdEntity::compareTo);
    }
}
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 6

一种方法是将compare方法放在静态方法中:

public static interface IdEntity extends Comparable<IdEntity> {
  int getId();
  @Override default int compareTo(IdEntity other) {
    return defaultCompare(this, other);
  }
  static int defaultCompare(IdEntity first, IdEntity second) {
    return first.getId() - second.getId();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你的方法是:

Collections.sort(list, IdEntity::defaultCompare);
Run Code Online (Sandbox Code Playgroud)

  • 我还会考虑`Collections.sort(list,comparisonInt(IdEntity :: getId))`,静态导入`java.util.Comparator.comparingInt`.这使得它在前面非常清楚比较实际上在做什么并且几乎一样紧凑. (3认同)

Lou*_*man 5

更简单的方法:静态导入Comparator.comparingInt和使用

Collections.sort(list, comparingInt(IdEntity::getId));
Run Code Online (Sandbox Code Playgroud)

我不相信你可以重新提取默认compareTo实现:它被覆盖了; 您通常无法运行重写方法实现.但这只会直截了当地工作.