在Java中,我可以这样做:
import java.util.List;
import java.util.Map;
class Foo {
public final String s;
// Parameters to constructor are generic, but constrained
public <K> Foo(List<K> list, Map<K, String> map) {
// Compute something from those parameters where result
// has type independent of input type parameters.
StringBuilder sb = new StringBuilder();
for (K k : list) {
sb.append(map.get(k));
}
s = sb.toString();
}
}
请注意,Foo
类没有类型参数,但其构造函数具有类型参数。可以在Kotlin中完成相同的事情吗?
答案 0 :(得分:4)
在Java中
public class Bar<K,V> {
public final int x;
public Bar(Map<K, V> map) {
x = map.hashCode();
}
}
相当于Kotlin
class Bar <K,V> constructor (map: Map<K,V>) {
val x = map.hashCode()
}
在Java中
public class Bar {
public final int x;
public Bar(Map map) {
x = map.hashCode();
}
}
相当于Kotlin
class Bar constructor (map: Map<*, *>) {
val x = map.hashCode()
}
在Java中
public class Bar {
public final int x;
public <K, V>Bar(Map<K, V> map) {
x = map.hashCode();
}
}
相当于Kotlin
// no way to do so
根据Kotlin garmmer,在Kotlin中没有相应的实现,因为我们无法在主构造函数或辅助构造函数中定义类型参数。
答案 1 :(得分:3)
Kotlin不支持构造函数的类型参数,因此您可以改为定义工厂函数:
class Foo private constructor(val s: String) {
companion object {
fun <K> create(list: List<K>, map: Map<K, String>) =
Foo(list.map { map[it] }.joinToString(""))
}
}