LeonardoSibela:
私は、次のクラスを作成しようとしていました。
class MyClass {
var foos: List<Foo> = listOf()
constructor(foos: List<Foo>) {
this.foos = foos
}
constructor(bars: List<Bar>) : super() {
this.foos = bars.map { bar ->
Foo(bar)
}
}
}
しかし、私はというエラーが出ます:
プラットフォーム宣言衝突次の宣言は同じJVM署名有する((Ljava / UTIL /リスト;)Vを):
私は、彼らは両方のリストオブジェクトであることを理解し、私は必ずそれが問題ではないでしょうだったので、彼らはジェネリックで入力されます。
リノ:
Javaで呼ばれるものが存在するため、この問題が発生した型消去を。kotlinはJVMを使用しているので、それはまた、この制限の影響を受けています。TLを与えるには、DRを、
ジェネリック型を内に保持される.class
Javaは(あなたのケースでは、クラスがあることを知っているように、ファイルList
)ジェネリックです。しかし、それは、インスタンスのジェネリック型を追跡することはできません。インスタンスはそうList<Foo>
とList<Bar>
、両方の自分で処理された生タイプ(実行時にフォームList
)。ジェネリック医薬品は、型の安全性を確保するために、コンパイル時にのみ使用されていることに注意してください。
この制限を克服するには、kotlinで演算子のオーバーロードを利用することができます。オペレータは、我々は、ISを見ている()
あなたはすべてのインスタンスを起動していますされてみましょう。使用することでcompanion object
私たちも、このことができますinvoke
コンストラクタのような外観をし、1(のように呼び出すことMyClass()
)。あなたのコードは次のようになります。
class MyClass(var foos: List<Foo>) {
companion object {
operator fun invoke(bars: List<Bar>) = MyClass(bars.map(::Foo))
}
}
どちらのあなたは、単にこのようにそれを呼び出すことができます:
val mc1 = MyClass(foos) // calls constructor
val mc2 = MyClass(bars) // calls companion.invoke