使用来自Kotlin的Guava的toImmutableSortedMap收集器的泛型错误

问题描述 投票:1回答:1

[我正在尝试使用Kotlin 1.3.50中的Guava的toImmutableSortedMap收集器(在macOS 10.14.6及更高版本上的Java 13上)。每当我尝试使用toImmutableSortedMap时都会出现泛型错误,但是如果我使用toImmutableMap则不会出现任何错误:

val map = mutableMapOf<String, MutableMap<Path, String>>()

// populate map

// toImmutableSortedMap has compile-time generics errors
map.entries.stream()
.collect(
    toImmutableSortedMap<Map.Entry<String, MutableMap<Path, String>>, String, ImmutableSortedMap<Path, String>>(
        naturalOrder<String>(),
        {it.key},                             // errors e1 & e2 here
        {ImmutableSortedMap.copyOf(it.value)} // errors e3 & e4 here
    )
)

// toImmutableMap works fine
map.entries.stream()
.collect(
    toImmutableMap<Map.Entry<String, MutableMap<Path, String>>, String, ImmutableSortedMap<Path, String>>(
        {it.key},
        {ImmutableSortedMap.copyOf(it.value)}
    )
)

toImmutableSortedMap的通用错误:

e1: Type mismatch: inferred type is () -> [ERROR : <ERROR PROPERTY TYPE>] but Function<in Map.Entry<String, MutableMap<Path, String>>!, out String!>! was expected
e2: Unresolved reference: it
e3: Type mismatch: inferred type is () -> ??? but Function<in Map.Entry<String, MutableMap<Path, String>>!, out ImmutableSortedMap<Path, String>!>! was expected
e4: Unresolved reference: it

任何想法如何解决此问题?

generics kotlin java-stream guava
1个回答
0
投票

您可以显式添加一些类型,它将起作用:

map.entries.stream()
    .collect(
        toImmutableSortedMap<Map.Entry<String, MutableMap<Path, String>>, String, ImmutableSortedMap<Path, String>>(
            naturalOrder<String>(),
            Function { it.key },                             
            Function { ImmutableSortedMap.copyOf(it.value) } 
        )
    )

对我来说,科特林的SAM转换似乎有些问题

© www.soinside.com 2019 - 2024. All rights reserved.