提交 61c292be 编写于 作者: H henryjen

8033590: java.util.Comparator::thenComparing has unnecessary type restriction

Reviewed-by: psandoz
上级 bd55ca2b
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -235,7 +235,7 @@ public interface Comparator<T> { ...@@ -235,7 +235,7 @@ public interface Comparator<T> {
* @see #thenComparing(Comparator) * @see #thenComparing(Comparator)
* @since 1.8 * @since 1.8
*/ */
default <U extends Comparable<? super U>> Comparator<T> thenComparing( default <U> Comparator<T> thenComparing(
Function<? super T, ? extends U> keyExtractor, Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator) Comparator<? super U> keyComparator)
{ {
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
/** /**
* @test * @test
* @summary Comparator API narrowing type test * @summary Comparator API narrowing type test
* @bug 8033590
* @run testng TypeTest * @run testng TypeTest
*/ */
...@@ -33,6 +34,8 @@ import java.util.TreeMap; ...@@ -33,6 +34,8 @@ import java.util.TreeMap;
import java.util.Comparator; import java.util.Comparator;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit") @Test(groups = "unit")
public class TypeTest { public class TypeTest {
static class Person { static class Person {
...@@ -66,6 +69,24 @@ public class TypeTest { ...@@ -66,6 +69,24 @@ public class TypeTest {
} }
} }
static class Department {
Manager mgr;
String hr_code;
Department(Manager mgr, String hr) {
this.mgr = mgr;
this.hr_code = hr;
}
Manager getManager() {
return mgr;
}
String getHR() {
return hr_code;
}
}
static <T> void assertOrder(T o1, T o2, Comparator<? super T> cmp) { static <T> void assertOrder(T o1, T o2, Comparator<? super T> cmp) {
if (cmp.compare(o1, o2) > 0) { if (cmp.compare(o1, o2) > 0) {
System.out.println("Fail!!"); System.out.println("Fail!!");
...@@ -75,6 +96,8 @@ public class TypeTest { ...@@ -75,6 +96,8 @@ public class TypeTest {
} }
} }
// Type tests just to make sure the code can compile and build
// Not necessarily need a meaningful result
public void testOrder() { public void testOrder() {
Manager m1 = new Manager("Manager", 2, 2000); Manager m1 = new Manager("Manager", 2, 2000);
Manager m2 = new Manager("Manager", 4, 1300); Manager m2 = new Manager("Manager", 4, 1300);
...@@ -93,4 +116,23 @@ public class TypeTest { ...@@ -93,4 +116,23 @@ public class TypeTest {
Map<String, Integer> map = new TreeMap<>(); Map<String, Integer> map = new TreeMap<>();
map.entrySet().stream().sorted(Map.Entry.comparingByKey(String.CASE_INSENSITIVE_ORDER)); map.entrySet().stream().sorted(Map.Entry.comparingByKey(String.CASE_INSENSITIVE_ORDER));
} }
public void testJDK8033590() {
Manager a = new Manager("John Doe", 1234, 16);
Manager b = new Manager("Jane Roe", 2468, 16);
Department da = new Department(a, "X");
Department db = new Department(b, "X");
Comparator<Department> cmp = Comparator.comparing(Department::getHR)
.thenComparing(Department::getManager, Employee.C);
assertTrue(cmp.compare(da, db) < 0);
cmp = Comparator.comparing(Department::getHR)
.thenComparing(Department::getManager, Manager.C);
assertTrue(cmp.compare(da, db) == 0);
cmp = Comparator.comparing(Department::getHR)
.thenComparing(Department::getManager, Person.C);
assertTrue(cmp.compare(da, db) > 0);
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册