我从一个文本文件中读取了以下代码行:

try (BufferedReader br = new BufferedReader(new InputStreamReader(Uio.decodeFrom(url)))) {
        return br.lines()
                .parallel()
                .map(s -> s.split("\\s+")) // split by whitespace
                .collect(
                        Collectors.groupingByConcurrent(
                                arr -> arr[0], // String 1
                                Collectors.groupingByConcurrent(
                                        arr -> arr[arr.length-1], // String 2
                                        Collectors.counting()
                                )
                        )
                );
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }

该文本文件包含如下数据

String1     ... cols      ... String2
string1data ... otherdata ... string2data
...

我试着按String1String2分组,然后计算它们的数量.那么最终结果应该是Map<String, Map<String, Long>>分.然而,使用上面的代码,编译器认为collect()返回 ConcurrentMap <Object, ConcurrentMap<Object, Long>>.

为什么 keys 不是字符串?

推荐答案

我可以重复这个错误消息,但错误消息中将String替换为Object似乎是在转移注意力.真正的问题是Java的泛型是不变的.

如果对collect的调用返回ConcurrentMap<String, ConcurrentMap<String, Long>>,则不匹配Map<String, Map<String, Long>>,即使ConcurrentMapMap.内部Map类型必须完全匹配,不带通配符和边界.

如果将上限通配符引入返回类型,它将不会出错地进行编译.让它返回类型Map<String, ? extends Map<String, Long>>,这样内部ConcurrentMap<String, Long>就会匹配.

返回类型为Map<String, ConcurrentMap<String, Long>>也可以.

在解决泛型不变量问题之前,尚不清楚为什么没有捕获String.只是猜测:编译器还没有捕获String,因为它首先发现了不变泛型问题.一旦不变泛型问题得到解决,它就可以编译而不会出错,这意味着可以推断出String个.

Java相关问答推荐

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

现场观看Android Studio中的变化

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

JPanel透支重叠的JComcoBox

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

为什么有两种实现来检索数组类的组件类型?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

无法将GSON导入到我的JavaFX Maven项目

Android Studio模拟器没有互联网

循环不起作用只有第一个元素重复

Win32函数的JNA绑定DwmGetColorizationColor返回E_INVALIDARG错误

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

使用DynamoDB增强客户端时未更新属性

更新不可变的深层嵌套字段

将非滚动组件添加到 JScrollPane