当我在一个涉及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()));
}
}
这与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版本时,编译时不会出现警告。这是什么原因?