当前位置: 首页 > 知识库问答 >
问题:

为什么新的Java8流在toArray调用时返回对象数组?

沈龙光
2023-03-14

当我在一个涉及Java8新流的项目中工作时,我注意到当我对流调用stream#toArray()时,它返回的是object[]而不是t[]。尽管我很惊讶,但我开始深入研究Java 8的源代码,找不到为什么他们没有将object[]toArray();实现为t[]toArray();的任何理由。这背后有什么道理吗,还是仅仅是一种(在)一致性?

编辑1:我在回答中注意到很多人说这是不可能的,但是这个代码段编译并返回预期的结果?

import java.util.Arrays;

public class Test<R> {

    private Object[] items;

    public Test(R[] items) {
        this.items = items;
    }

    public R[] toArray() {
        return (R[]) items;
    }

    public static void main(String[] args) {
        Test<Integer> integerTest = new Test<>(new Integer[]{
            1, 2, 3, 4
        });

        System.out.println(Arrays.toString(integerTest.toArray()));
    }

}

共有1个答案

弓宏茂
2023-03-14

这与list#toArray()存在的问题相同。类型擦除使我们无法知道应该返回的数组类型。请考虑以下事项

class Custom<T> {
    private T t;
    public Custom (T t) {this.t = t;}
    public T[] toArray() {return (T[]) new Object[] {t};} // if not Object[], what type?
}

Custom<String> custom = new Custom("hey");
String[] arr = custom.toArray(); // fails

对象[]不是字符串[],因此无论强制转换如何,都不能将其分配给对象[]。同样的思想也适用于列表。使用重载的toArray(..)方法。

 类似资料:
  • 我正在搜索文档中的contacts数组中包含特定_ID的文档。下面是结构: 它执行与$elemmatch查询相同的操作。 我可能错过了一些非常基本的东西,但如果你们能提供一些建议,我将非常感谢。

  • 首先,我收到来自post string属性和来自控制器的inputStream。 接下来,我的服务调用ParseGeojosnStream以流式传输文件的内容。 接下来,传递特性的名称和列表,并将其插入表中。 最后,使用字符串属性和表名作为id创建scheme。 那么,当强制转换为json并将其存储在数据库中时,为什么要返回一个空的属性对象呢? 代码如下: log.info(“jsonGeomet

  • 我的实现中有以下代码行: 我试着在我的测试课上模仿上述内容,如下所示: 但是当我调试测试代码时,我可以看到myService。getTypes正在返回一个空列表。有什么问题? 还有,有没有办法使用args来简化上述模拟?我发现的只是使用传递到方法中的参数,而不是传递到方法中的参数。

  • 在单元测试(Groovy和Spock)的中,我用mock填充上面的字段: 接下来,在我的测试用例中,我调用一个方法,我希望从中获取,该方法来自步骤中的模拟对象: 问题是,对于,我将获得。 这是因为我以错误的方式使用Groovy吗?如何使成为它应该成为的对象?我应该使用mock/stub吗?

  • 问题内容: 我和我的同事有一个错误,这是由于我们假设会返回空流调用而导致的。 当然,假定和不阅读文档是我们的错。但是我不明白的是为什么空流的默认行为会返回。这是什么原因呢?像(相反地返回false)一样,此操作以命令式方式使用,它离开了monad,并且可能在语句中使用了。考虑到这些事实,是否有任何理由使大多数用途都需要默认为空流? 问题答案: 这就是所谓的虚无事实。空集合的所有成员都满足您的条件;

  • 在C++98中,以下代码无法编译,因为ifstream没有复制构造函数: 但是,在C++11中使用多个GCC版本时,编译时不会出现警告。这是什么原因?