Java 8 - 通用供应商

naX*_*aXa 3 type-erasure java-8

今天我尝试引用泛型中的构造函数.为什么不正确?

import java.util.Collection;
import java.util.function.Supplier;

class Foo<R extends Collection<Integer>> {
    Supplier<R> supplier = R::new;  // Compiler error!
}
Run Code Online (Sandbox Code Playgroud)

错误文字:

java: unexpected type
  required: class or array
  found:    type parameter R
Run Code Online (Sandbox Code Playgroud)

是因为类型擦除?或者也许我做错了?

Bri*_*etz 8

在编译时,你所知道的R就是它的束缚; 它是一个子类型Collection<Integer>.你不知道哪个类R对应.但是你试图引用一个构造函数 - 并且为了引用一个构造函数,你必须确切地知道你正在构造什么类.由于同样的原因,以下所有内容都无法工作:不知道R是什么,并且您需要知道R是什么来调用它的构造函数.

Supplier<R> supplier = R::new
Supplier<R> supplier = () -> new R();
R r = new R();
Run Code Online (Sandbox Code Playgroud)

即使R被宣布为,情况也是如此<R extends ArrayList<String>>.在这种情况下,你知道R延伸了ArrayList<String>,但你仍然不知道它是什么类!

如果您尝试访问虚拟成员Collection<Integer>,它将起作用:

ToIntFunction<R> sizer = R::size;
Run Code Online (Sandbox Code Playgroud)

因为,无论如何R,它必须有一个size()方法.