如何在java-8中找到流类型

Dea*_*ool -1 java java-8

我有使用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,因为在运行时将删除其他泛型类型信息

sco*_*ttb 7

这不是流的问题.该错误反映了在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在不可重定义的类型上使用运算符.