-
Bug
-
Resolution: Cannot Reproduce
-
P4
-
None
-
6
-
x86
-
linux, solaris_8
FULL PRODUCT VERSION :
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
javac rejects the following apparently incorrect snippet of code
<T> void sort(T[] a, Comparator<? super T> c) { return null; }
Enum[] ea = null;
Comparator<Enum<?>> comp = null;
{ sort(ea, comp); }
I tried the following to see which way the subtype relations run between Enum and Enum<?>
List<? extends Enum<?>> t1 = null;
List<? extends Enum> t2 = null;
// { t1 = t2; } // error here indicates Enum is not a subtype of Enum<?>
{ t2 = t1; } // allowed, showing Enum<?> is a subtype of Enum
javac appears to infer Enum in the call to sort(...), but that should lead to an error based on the subtyping relations. javac agrees, rejecting
{ this.<Enum>sort(ea, comp); }
The fact that javac does not check the call after inferring the type argument is a bug.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the enclosed test case, which should fail
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Bound.java:13: <T>sort(T[],java.util.Comparator<? super T>) in Bound cannot be applied to (java.lang.Enum[],java.util.Comparator<java.lang.Enum<?>>)
{ this.<Enum>sort(ea, comp); } // yet javac accepts this code, inferring T=Enum
^
1 error
ACTUAL -
compile without error
ERROR MESSAGES/STACK TRACES THAT OCCUR :
error messages missing
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.*;
class Bound {
List<? extends Enum<?>> t1 = null;
List<? extends Enum> t2 = null;
// { t1 = t2; } // error here indicates Enum is not a subtype of Enum<?>
{ t2 = t1; }
<T> T sort(T[] a, Comparator<? super T> c) { return null; }
Enum[] ea = null;
Comparator<Enum<?>> comp = null;
{ this.sort(ea, comp); } // yet javac accepts this code, inferring T=Enum
// suggesting Enum<?> is a supertype of Enum.
}
---------- END SOURCE ----------
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
javac rejects the following apparently incorrect snippet of code
<T> void sort(T[] a, Comparator<? super T> c) { return null; }
Enum[] ea = null;
Comparator<Enum<?>> comp = null;
{ sort(ea, comp); }
I tried the following to see which way the subtype relations run between Enum and Enum<?>
List<? extends Enum<?>> t1 = null;
List<? extends Enum> t2 = null;
// { t1 = t2; } // error here indicates Enum is not a subtype of Enum<?>
{ t2 = t1; } // allowed, showing Enum<?> is a subtype of Enum
javac appears to infer Enum in the call to sort(...), but that should lead to an error based on the subtyping relations. javac agrees, rejecting
{ this.<Enum>sort(ea, comp); }
The fact that javac does not check the call after inferring the type argument is a bug.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the enclosed test case, which should fail
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Bound.java:13: <T>sort(T[],java.util.Comparator<? super T>) in Bound cannot be applied to (java.lang.Enum[],java.util.Comparator<java.lang.Enum<?>>)
{ this.<Enum>sort(ea, comp); } // yet javac accepts this code, inferring T=Enum
^
1 error
ACTUAL -
compile without error
ERROR MESSAGES/STACK TRACES THAT OCCUR :
error messages missing
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.*;
class Bound {
List<? extends Enum<?>> t1 = null;
List<? extends Enum> t2 = null;
// { t1 = t2; } // error here indicates Enum is not a subtype of Enum<?>
{ t2 = t1; }
<T> T sort(T[] a, Comparator<? super T> c) { return null; }
Enum[] ea = null;
Comparator<Enum<?>> comp = null;
{ this.sort(ea, comp); } // yet javac accepts this code, inferring T=Enum
// suggesting Enum<?> is a supertype of Enum.
}
---------- END SOURCE ----------
- duplicates
-
JDK-6730468 javac infers inapplicable method
- Closed
- relates to
-
JDK-6638712 Inference with wildcard types causes selection of inapplicable method
- Closed
-
JDK-6650759 Inference of formal type parameter (unused in formal parameters) is not performed
- Closed
-
JDK-6640435 inference: propagate >> and == constraints to help uninferred type vars
- Closed