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)
是因为类型擦除?或者也许我做错了?
在编译时,你所知道的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()方法.