java-8 – Java 8 – 通用供应商

今天我尝试了reference一个通用的构造函数.为什么不正确?

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

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

错误文字:

java: unexpected type
  required: class or array
  found:    type parameter R

是因为type erasure吗?或者也许我做错了?

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

Supplier<R> supplier = R::new
Supplier<R> supplier = () -> new R();
R r = new R();

即使R被声明为< R extends ArrayList< String>>,情况也是如此.在这种情况下,您知道R扩展了ArrayList< String>,但您仍然不知道它是什么类!

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

ToIntFunction<R> sizer = R::size;

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

转载注明原文:java-8 – Java 8 – 通用供应商 - 代码日志