如何在Java-8中查找流类型

时间:2018-12-05 20:46:12

标签: java java-8

我有一个以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形式,因为在运行时会删除更多的通用类型信息

2 个答案:

答案 0 :(得分:7)

这不是流的问题。该错误反映了用Java实现泛型类型的方式。

Java通用类型是不可修改的

在Java中,泛型类型在运行时可用的类型信息少于编译时可用的类型信息。之所以这样,是因为泛型是通过 erasure 在Java中实现的。大多数通用类型信息仅在编译时存在,并在运行时删除。

由于这个原因,无法为任何不可验证的类型获取Class对象。类型信息在运行时不可用。

不仅不能为Class获取一个Stream<String>对象,而且不能为ClassT中的任何一个获取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
}