我有使用Streamobject作为参数的方法,在该方法中我必须根据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
}
}
Run Code Online (Sandbox Code Playgroud)
编译错误
无法对参数化类型Stream执行instanceof检查.请使用表单Stream,因为在运行时将删除其他泛型类型信息
这不是流的问题.该错误反映了在Java中实现泛型类型的方式.
Java泛型类型是不可恢复的.
在Java中,泛型类型在运行时可用的类型信息少于编译时的类型信息.这是因为泛型是通过擦除在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);
Run Code Online (Sandbox Code Playgroud)
相反,Java编译器不允许instanceof在不可重定义的类型上使用运算符.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |