FULL PRODUCT VERSION :
java version "1.8.0_172-ea"
Java(TM) SE Runtime Environment (build 1.8.0_172-ea-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b03, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux Crushinator 4.14.15-gentoo #1 SMP Wed Jan 24 07:55:59 EST 2018 x86_64 Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz GenuineIntel GNU/Linux
A DESCRIPTION OF THE PROBLEM :
I apologize, I do not know enough of the internal jargon of Java's type system to write a succinct title for this bug report. Please retitle this report as appropriate.
The attached minimal test case demonstrates a shortcoming of javac in dealing with type inference on method references. Please note that Eclipse's ECJ compiler has no problem with this.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the attached code.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Code compiles.
ACTUAL -
javac reports an error.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Demo.java:6: error: no suitable method found for lowerBound(C[],int,int,sought::compareTo)
return Demo.lowerBound(array, 0, array.length, sought::compareTo);
^
method Demo.<C>lowerBound(C[],C) is not applicable
(cannot infer type-variable(s) C
(actual and formal argument lists differ in length))
method Demo.<T>lowerBound(T[],int,int,ToIntFunction<T>) is not applicable
(inference variable T has incompatible upper bounds ? super C,Object)
where C,T are type-variables:
C extends Comparable<? super C> declared in method <C>lowerBound(C[],C)
T extends Object declared in method <T>lowerBound(T[],int,int,ToIntFunction<T>)
1 error
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/* Demo.java */
import java.util.function.ToIntFunction;
public final class Demo {
public static final <C extends Comparable<? super C>> int lowerBound(C[] array, C sought) {
return lowerBound(array, 0, array.length, sought::compareTo);
}
public static <T> int lowerBound(T[] array, int low, int high, ToIntFunction<T> compare) {
int i;
for (i = low; i < high && compare.applyAsInt(array[i]) > 0; ++i) {
}
return i;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Explicitly specifying the type parameter on the method call suppresses the error:
return Demo.<C>lowerBound(array, 0, array.length, sought::compareTo);
java version "1.8.0_172-ea"
Java(TM) SE Runtime Environment (build 1.8.0_172-ea-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b03, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux Crushinator 4.14.15-gentoo #1 SMP Wed Jan 24 07:55:59 EST 2018 x86_64 Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz GenuineIntel GNU/Linux
A DESCRIPTION OF THE PROBLEM :
I apologize, I do not know enough of the internal jargon of Java's type system to write a succinct title for this bug report. Please retitle this report as appropriate.
The attached minimal test case demonstrates a shortcoming of javac in dealing with type inference on method references. Please note that Eclipse's ECJ compiler has no problem with this.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the attached code.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Code compiles.
ACTUAL -
javac reports an error.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Demo.java:6: error: no suitable method found for lowerBound(C[],int,int,sought::compareTo)
return Demo.lowerBound(array, 0, array.length, sought::compareTo);
^
method Demo.<C>lowerBound(C[],C) is not applicable
(cannot infer type-variable(s) C
(actual and formal argument lists differ in length))
method Demo.<T>lowerBound(T[],int,int,ToIntFunction<T>) is not applicable
(inference variable T has incompatible upper bounds ? super C,Object)
where C,T are type-variables:
C extends Comparable<? super C> declared in method <C>lowerBound(C[],C)
T extends Object declared in method <T>lowerBound(T[],int,int,ToIntFunction<T>)
1 error
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/* Demo.java */
import java.util.function.ToIntFunction;
public final class Demo {
public static final <C extends Comparable<? super C>> int lowerBound(C[] array, C sought) {
return lowerBound(array, 0, array.length, sought::compareTo);
}
public static <T> int lowerBound(T[] array, int low, int high, ToIntFunction<T> compare) {
int i;
for (i = low; i < high && compare.applyAsInt(array[i]) > 0; ++i) {
}
return i;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Explicitly specifying the type parameter on the method call suppresses the error:
return Demo.<C>lowerBound(array, 0, array.length, sought::compareTo);