Java 8 Java 8-通用供应商

Java 8 Java 8-通用供应商,java-8,type-erasure,Java 8,Type Erasure,今天我试着用泛型创建一个构造函数。为什么不正确 import java.util.Collection; import java.util.function.Supplier; class Foo<R extends Collection<Integer>> { Supplier<R> supplier = R::new; // Compiler error! } 是因为什么?或者我做错了?在编译时,关于R的所有知识都是它的界限;它是集合的子类型

今天我试着用泛型创建一个构造函数。为什么不正确

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

class Foo<R extends Collection<Integer>> {
    Supplier<R> supplier = R::new;  // Compiler error!
}

是因为什么?或者我做错了?

在编译时,关于
R
的所有知识都是它的界限;它是
集合的子类型。您不知道
R
对应于哪个类。但是您正在尝试引用一个构造函数——要引用一个构造函数,您必须确切地知道您要构造的类。由于同样的原因,以下所有操作都将失败:不知道R是什么,您需要知道R是什么来调用它的构造函数

Supplier<R> supplier = R::new
Supplier<R> supplier = () -> new R();
R r = new R();
Supplier-Supplier=R::新建
供应商=()->新R();
R=新的R();
即使R被声明为
,情况也是如此。在本例中,您知道R扩展了
ArrayList
,但仍然不知道它是什么类

如果您试图访问
集合
的虚拟成员,它将工作:

ToIntFunction<R> sizer = R::size;
ToIntFunction sizer=R::size;

因为,无论
R
是什么,它都必须有
size()
方法

调用
newr()也不起作用…您知道运行此代码时R是什么吗?(提示:编译器没有。)
ToIntFunction<R> sizer = R::size;