Don't rely on javac's (broken) handling of wildcard erasure.
The JLS doesn't define what erasing a wildcard means, but a javac bug
caused it to try to erase wildcards anyways. The bug will be fixed in
an upcoming version of javac [1], which breaks this code.
This change implements wildcard simplification to match the class
javadoc: ? extends Foo -> erasure(Foo)
and: ? -> Object
[1] https://bugs.openjdk.java.net/browse/JDK-8055054
Change-Id: I0dbce8849a03c48bc838b8ad47a6ccd535257148
Review-Link: https://gwt-review.googlesource.com/#/c/9681/
(cherry picked from commit a5df12388dcfb79ecb333ddb8e5279931e2246c3)
diff --git a/user/src/com/google/web/bindery/requestfactory/apt/TypeSimplifier.java b/user/src/com/google/web/bindery/requestfactory/apt/TypeSimplifier.java
index 676005f..83730bd 100644
--- a/user/src/com/google/web/bindery/requestfactory/apt/TypeSimplifier.java
+++ b/user/src/com/google/web/bindery/requestfactory/apt/TypeSimplifier.java
@@ -102,7 +102,15 @@
@Override
public TypeMirror visitWildcard(WildcardType x, State state) {
- return state.types.erasure(x).accept(this, state);
+ // The JLS doesn't define erasure for wildcards [1], so don't rely on
+ // javac's implementation. Instead, simplify wildcards as:
+ // ? extends Foo -> erasure(Foo)
+ // and: ? -> Object
+ //
+ // [1] https://bugs.openjdk.java.net/browse/JDK-8055054
+ return x.getExtendsBound() != null
+ ? x.getExtendsBound().accept(this, state)
+ : state.findType(Object.class);
}
@Override