2016-10-19 2 views
1

В 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 класса не имеют параметров типа, но его конструктор имеет тип параметров. Можно ли сделать что-то подобное в Котлине?

+0

У вас есть случай использования в виде, что требует это вместо того, воспроизведенных на самом классе? Какова цель дженериков, которые не ограничивают ничего в конструкторе? –

+0

@JaysonMinard Это был урезанный пример, чтобы попытаться сохранить все просто, но, видимо, я зашел слишком далеко. Я изменил пример на нечто более реалистичное, что, надеюсь, иллюстрирует, почему мне могут понадобиться параметры типа конструктора, которые не превращаются в параметры типа класса. –

+0

Я думаю, что предложение @ yole охватывает ваш случай, фабричный метод., –

ответ

3

Котлин не поддерживают параметры типа для конструкторов, так что вы можете определить функцию заводской вместо:

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

В Java

public class Bar<K,V> { 
    public final int x; 

    public Bar(Map<K, V> map) { 
    x = map.hashCode(); 
    } 
} 

эквивалент в Котлин

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(); 
    } 
} 

эквивалент в Котлин

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(); 
    } 
} 

эквивалент в Котлин

// no way to do so 

Согласно Котлин garmmer, нет никакого эквивалента в реализации в Котлин, потому что мы не можем определить тип параметров в первичных, ни вторичных конструктора.

+0

Извините, у меня была ошибка в коде Java, который я опубликовал изначально. Я только что исправил это. Вам не нужны параметры типа в классе в Java, поскольку вы можете поместить параметры типа в конструктор. –

+0

@LaurenceGonsalves Только что проверил kotlin [grammer] (https://kotlinlang.org/docs/reference/grammar.html#secondaryConstructor) Невозможно это сделать. –

+0

Действительно ли Kotlin 'Map <*, *>' действительно похож на сырую «карту» на Java, или она больше похожа на подстановочный знак «Карта '? –

Смежные вопросы