inference: retrieve type from containing call if the corresponding method is not generics (IDEA-151443)

This commit is contained in:
Anna Kozlova
2016-02-09 20:09:10 +01:00
parent 938a77511a
commit 1f640238e0
5 changed files with 46 additions and 4 deletions
@@ -10,7 +10,7 @@ class NachCollections<K,V> {
Collection<? super Map.Entry<K,V>> c2,
Consumer<Map.Entry<K, V>> a) {
c1.forEach(consumer(a));
c2.forEach<error descr="'forEach(java.util.function.Consumer<? super capture<? super java.util.Map.Entry<K,V>>>)' in 'java.lang.Iterable' cannot be applied to '(java.util.function.Consumer<java.util.Map.Entry<K,V>>)'">(consumer(a))</error>;
c2.forEach(consumer<error descr="'consumer(java.util.function.Consumer<java.util.Map.Entry<K1,V1>>)' in 'NachCollections' cannot be applied to '(java.util.function.Consumer<java.util.Map.Entry<K,V>>)'">(a)</error>);
}
}
@@ -29,7 +29,7 @@ public class ConcurrentCollectors {
static <T, K, D, M1 extends Map<K, D>> C<T, M1> groupingBy(F<M1> f,
C<T, D> c,
BiConsumer<M1, T> consumer) {
return new CImpl<><error descr="'CImpl(ConcurrentCollectors.F<R>, ConcurrentCollectors.BiConsumer<R,T>, ConcurrentCollectors.BiOp<R>)' in 'ConcurrentCollectors.CImpl' cannot be applied to '(ConcurrentCollectors.F<M1>, ConcurrentCollectors.BiConsumer<M1,T>, ConcurrentCollectors.BiOp<ConcurrentCollectors.ConcurrentMap<java.lang.Object,D>>)'">(f, consumer, arg(c.getOp()))</error>;
return new CImpl<>(f, consumer, arg<error descr="'arg(ConcurrentCollectors.BiOp<V>)' in 'ConcurrentCollectors.Test3' cannot be applied to '(ConcurrentCollectors.BiOp<D>)'">(c.getOp())</error>);
}
static <K, V, M2 extends ConcurrentMap<K, V>> BiOp<M2> arg(BiOp<V> op) {
@@ -0,0 +1,37 @@
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Foo foo = first().get();
System.out.println(foo.getClass());
}
static CompletableFuture<Foo> first() {
return second().thenCompose(maybe -> maybe.map(bar -> CompletableFuture.completedFuture(new Foo()))
.orElseGet(() -> CompletableFuture.completedFuture(new FooExt())));
}
static CompletableFuture<Optional<Bar>> second() {
return CompletableFuture.completedFuture(Optional.empty());
}
static void simplified(final Optional<CompletableFuture<Foo>> future) {
future.orElseGet(() -> CompletableFuture.completedFuture(new FooExt()));
}
}
class Foo {
}
class FooExt extends Foo {
}
class Bar {
}