我有一个以Stream
对象作为参数的方法,在该方法中,我必须基于Stream
类型执行一些操作。但是instanceof
无法正常工作,并且出现编译错误
public <T>boolean objectIsNullOREmpty(Stream<T> str) {
if(str instanceof Stream<String>) {
//do some actions
}
if(Str instanceof Stream<SomeClass>) {
//do some actions
}
}
编译错误
无法对参数化类型Stream进行instanceof检查。请改用Stream形式,因为在运行时会删除更多的通用类型信息
答案 0 :(得分:7)
这不是流的问题。该错误反映了用Java实现泛型类型的方式。
Java通用类型是不可修改的。
在Java中,泛型类型在运行时可用的类型信息少于编译时可用的类型信息。之所以这样,是因为泛型是通过 erasure 在Java中实现的。大多数通用类型信息仅在编译时存在,并在运行时删除。
由于这个原因,无法为任何不可验证的类型获取Class
对象。类型信息在运行时不可用。
不仅不能为Class
获取一个Stream<String>
对象,而且不能为Class
,T
中的任何一个获取List<T>
对象或List<String>
。这些都是不可更改的类型。
instanceof运算符仅适用于可从中获取Class
对象的类型。这也是一件好事,因为List<T>
,List<String>
和List<Integer>
在运行时都共享相同的Class对象。如果将以下代码段评估为true
,将会造成混乱并且容易出错:
List<String> strings = new ArrayList<>();
boolean b = strings instanceof List<Integer>;
System.out.println(b);
相反,Java编译器不允许在非可验证类型上使用instanceof
运算符。
答案 1 :(得分:0)
要添加到@scottb的答案中,如果您确实需要此结构,则需要单独的方法。由于擦除,您不能重载方法,因此必须命名每个方法,以使方法签名是唯一的:
public boolean stringIsNullOREmpty(Stream<String> str) {
//do some actions
}
public boolean someClassIsNullOREmpty(Stream<SomeClass> str) {
//do some actions
}