如何在Kotlin中为主构造函数指定类型参数?

时间:2016-10-19 01:30:59

标签: generics kotlin

在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中完成相同的事情吗?

2 个答案:

答案 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(""))
     }
}