【问题标题】:Java 8 - Generic SupplierJava 8 - 通用供应商
【发布时间】:2015-03-17 14:38:31
【问题描述】:

今天我尝试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吗?还是我做错了?

【问题讨论】:

  • 调用new R(); 也不起作用...
  • 你知道这段代码运行时 R 是什么吗? (提示:编译器没有。)

标签: java-8 type-erasure


【解决方案1】:

在编译时,你所知道的关于R 的只是它的界限;它是Collection&lt;Integer&gt; 的子类型。你不知道R对应什么类。但是你试图引用一个构造函数——并且要引用一个构造函数,你必须确切地知道你正在尝试构造什么类。出于同样的原因,以下所有操作都将失败:不知道 R 是什么,您需要知道 R 是什么才能调用它的构造函数。

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

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

如果您尝试访问Collection&lt;Integer&gt; 的虚拟成员,它会起作用:

ToIntFunction<R> sizer = R::size;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2017-03-07
    • 1970-01-01
    • 2023-03-23
    • 2015-09-23
    相关资源
    最近更新 更多