do not open captured wildcards on substitution; don't capture wildcards on getExtendsTypes for type parameters and their consequences

This commit is contained in:
Anna Kozlova
2015-12-02 10:17:29 +01:00
parent b9990696d3
commit 3a669178f5
27 changed files with 84 additions and 91 deletions
@@ -1,7 +1,7 @@
class Sample {
private <T> void collectClassInformation(java.util.Set<Class<? extends T>> classes) throws Exception {
for (Class<? extends T> root : classes) {
collectClassInformation<error descr="'collectClassInformation(java.util.Set<java.lang.Class<? extends T>>)' in 'Sample' cannot be applied to '(java.util.Set<java.lang.Class<capture<? extends T>>>)'">(getSubTypesOf(root))</error>;
collectClassInformation<error descr="'collectClassInformation(java.util.Set<java.lang.Class<? extends T>>)' in 'Sample' cannot be applied to '(java.util.Set<java.lang.Class<? extends capture<? extends T>>>)'">(getSubTypesOf(root))</error>;
}
}
@@ -17,7 +17,7 @@ class FooBar<T> {
}
void foo1(final FooBar<? super T> fooBar){
fooBar.supertype<error descr="'supertype(java.lang.Class<capture<? super T>>)' in 'FooBar' cannot be applied to '(java.lang.Class<java.lang.Iterable>)'">(Iterable.class)</error>;
fooBar.supertype<error descr="'supertype(java.lang.Class<? super capture<? super T>>)' in 'FooBar' cannot be applied to '(java.lang.Class<java.lang.Iterable>)'">(Iterable.class)</error>;
}
void foo2(final FooBar<? extends T> fooBar){
@@ -3,7 +3,7 @@ abstract class A<T> {
<K> void baz5(B<K, K> a) {}
abstract B<T, ? super T> foo5();
void bar5(A<? super T> a) {
baz5<error descr="'baz5(B<capture<? super T>,capture<? super T>>)' in 'A' cannot be applied to '(B<capture<? super T>,capture<? super T>>)'">(a.foo5())</error>;
baz5<error descr="'baz5(B<capture<? super capture<? super T>>,capture<? super capture<? super T>>>)' in 'A' cannot be applied to '(B<capture<? super T>,capture<? super capture<? super T>>>)'">(a.foo5())</error>;
}
<K> void baz7(B<K, K> a) {}
@@ -15,20 +15,20 @@ abstract class A<T> {
<K> void baz9(B<K, K> a) {}
abstract B<T, ? extends T> foo9();
void bar9(A<? extends T> a) {
baz9<error descr="'baz9(B<capture<? extends T>,capture<? extends T>>)' in 'A' cannot be applied to '(B<capture<? extends T>,capture<? extends T>>)'">(a.foo9())</error>;
baz9<error descr="'baz9(B<capture<? extends capture<? extends T>>,capture<? extends capture<? extends T>>>)' in 'A' cannot be applied to '(B<capture<? extends T>,capture<? extends capture<? extends T>>>)'">(a.foo9())</error>;
}
<K> void baz14(B<K, K> a) {}
abstract B<? super T, ? super T> foo14();
void bar14(A<? super T> a) {
baz14<error descr="'baz14(B<capture<? super T>,capture<? super T>>)' in 'A' cannot be applied to '(B<capture<? super T>,capture<? super T>>)'">(a.foo14())</error>;
baz14<error descr="'baz14(B<capture<? super capture<? super T>>,capture<? super capture<? super T>>>)' in 'A' cannot be applied to '(B<capture<? super capture<? super T>>,capture<? super capture<? super T>>>)'">(a.foo14())</error>;
}
<K> void baz24(B<K, K> a) {}
abstract B<? extends T, ? extends T> foo24();
void bar24(A<? extends T> a) {
baz24<error descr="'baz24(B<capture<? extends T>,capture<? extends T>>)' in 'A' cannot be applied to '(B<capture<? extends T>,capture<? extends T>>)'">(a.foo24())</error>;
baz24<error descr="'baz24(B<capture<? extends capture<? extends T>>,capture<? extends capture<? extends T>>>)' in 'A' cannot be applied to '(B<capture<? extends capture<? extends T>>,capture<? extends capture<? extends T>>>)'">(a.foo24())</error>;
}
}
@@ -1,4 +1,3 @@
interface NodeTraverser<T> {
NodeTraverser<T> filter(Predicate<? super T> filter);
@@ -26,9 +25,9 @@ class Test {
traverser1.filter<error descr="'filter(Predicate<? super capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>;
traverser1.filter1<error descr="'filter1(Predicate<capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>;
traverser1.filter2<error descr="'filter2(Predicate<capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>; // "'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'"
traverser1.filter2<error descr="'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>; // "'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'"
traverser2.filter<error descr="'filter(Predicate<capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>; // "'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'"
traverser2.filter<error descr="'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>; // "'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'"
traverser2.filter1<error descr="'filter1(Predicate<capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>;
traverser2.filter2<error descr="'filter2(Predicate<? extends capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<?>>)'">(filter)</error>;
@@ -42,7 +41,7 @@ class Test {
traverser1.filter1<error descr="'filter1(Predicate<capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'">(filter1)</error>;
traverser1.<error descr="Cannot resolve symbol 'filter2'">filter2</error>>(filter1);// "'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'"
traverser2.filter<error descr="'filter(Predicate<capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'">(filter1)</error>;// "'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'"
traverser2.filter<error descr="'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'">(filter1)</error>;// "'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'"
traverser2.filter1<error descr="'filter1(Predicate<capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? extends java.lang.String>>)'">(filter1)</error>;
traverser2.filter2(filter1);
@@ -54,9 +53,9 @@ class Test {
traverser1.filter(filter2);
traverser1.filter1<error descr="'filter1(Predicate<capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;
traverser1.filter2<error descr="'filter2(Predicate<capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;// "'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'"
traverser1.filter2<error descr="'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;// "'filter2(Predicate<? extends capture<? extends java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'"
traverser2.filter<error descr="'filter(Predicate<capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;// "'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'"
traverser2.filter<error descr="'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;// "'filter(Predicate<? super capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'"
traverser2.filter1<error descr="'filter1(Predicate<capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;
traverser2.filter2<error descr="'filter2(Predicate<? extends capture<? super java.lang.String>>)' in 'NodeTraverser' cannot be applied to '(Predicate<capture<? super java.lang.String>>)'">(filter2)</error>;
}
@@ -39,7 +39,7 @@ class VarianceTesting {
k[0] = new VarianceTesting();
x.method()[0] = new VarianceTesting();
<error descr="Incompatible types. Found: 'VarianceTesting[]', required: 'capture<? extends VarianceTesting>[]'">x.arrayField = new VarianceTesting[10]</error>;
l1.addAll<error descr="'addAll(java.util.Collection<capture<? extends VarianceTesting>>)' in 'java.util.List' cannot be applied to '(java.util.ArrayList<VarianceTesting>)'">(new ArrayList<VarianceTesting>())</error>;
l1.addAll<error descr="'addAll(java.util.Collection<? extends capture<? extends VarianceTesting>>)' in 'java.util.List' cannot be applied to '(java.util.ArrayList<VarianceTesting>)'">(new ArrayList<VarianceTesting>())</error>;
<error descr="Incompatible types. Found: 'java.util.ArrayList<java.lang.String>', required: 'java.util.List<? extends VarianceTesting>'">List<? extends VarianceTesting> l2 = new ArrayList<String>();</error>
List<? extends VarianceTesting> l3 = l2;
VarianceTesting t = l1.get(0);
@@ -214,7 +214,7 @@ public static void foo(List<? extends Foo> foos) {
class OtherBug1 {
public static void foo(List<? super Foo> foos) {
final Comparator<Foo> comparator = createComparator();
Collections.sort<error descr="'sort(java.util.List<capture<? super OtherBug1.Foo>>, java.util.Comparator<capture<? super OtherBug1.Foo>>)' in 'java.util.Collections' cannot be applied to '(java.util.List<capture<? super OtherBug1.Foo>>, java.util.Comparator<OtherBug1.Foo>)'">(foos, comparator)</error>;
Collections.sort<error descr="'sort(java.util.List<capture<? super OtherBug1.Foo>>, java.util.Comparator<? super capture<? super OtherBug1.Foo>>)' in 'java.util.Collections' cannot be applied to '(java.util.List<capture<? super OtherBug1.Foo>>, java.util.Comparator<OtherBug1.Foo>)'">(foos, comparator)</error>;
}
private static Comparator<Foo> createComparator() {