2016-09-21 21 views
3

ラムダ戻り型でのみ異なる2つのコンストラクタがあります。それらを過負荷にする方法はありますか?私はJvmOverloads注釈を使用しようとしていましたが、動作しませんでした。kotlinでコンストラクタをオーバーロードする方法はラムダ戻り型で異なります

constructor(db : Database, handler: (transaction: Transaction) -> Unit) : this(db, Handler<Transaction>({handler.invoke(it)})) 

@JvmOverloads 
constructor(db : Database, handler: (transaction: Transaction) -> Any) : this(db, Handler<Transaction>({handler.invoke(it)})) 

答えて

4

署名がジェネリック消去後衝突しまうので、あなたは(あなたのケースでは、それはFunction1<in P1, out R>のための一般的なパラメータです)一般的なパラメータのみが異なる署名でコンストラクタを定義することはできません。

しかし、あなたのケースでUnitAnyのサブタイプである、とFunction<in P1, out R>is covariant on R以来、あなたはとてもだけの最初のものを削除し、二コンストラクタにUnitを返す関数を渡すことができます。

簡体例:より複雑な例については

class C(val action: (Int) -> Any) 

fun main(args: Array<String>) { 
    val f: (Int) -> Unit = { println(it) } 
    C(f) 
} 

consider changing to factory functions:コンストラクタとは異なり、あなたは署名の衝突を避けるために@JvmNameでそれらに注釈を付けることができます。

@JvmName("createCUnit") 
fun createC(f: (Int) -> Unit) = C(f) 

fun createC(f: (Int) -> Any) = C(f) 
3

JVMのバックエンドをターゲットに、すべてのKotlinクラスはJVMバイトコードにコンパイルされます。 javaのバイトコードの問題はtype erasureです。これは、ジェネリックスに関するすべての情報が削除されたことを意味します(Javaの問題、Kotlinの問題ではありません)。

機能タイプ(transaction: Transaction) -> Unitを宣言することは、このタイプを使用することに同義です。Function1<Transaction, Unit>。ただし、JVMのバイトコードでは、Function1<Transaction, Unit>Function1<Transaction, Any>の両方が同じです。

これは、両方のコンストラクタがJVMの世界で同じ署名を持つことを意味します。

あなたはcompanion object

class MyClass { 
    constructor(db: Database, h: Handler<Transaction>) 

    companion object { 
     operator fun invoke(db: Database, handler: (transaction: Transaction) -> Unit) = MyClass(db, Handler<Transaction>({ handler.invoke(it) })) 

     @JvmName("alternative_constructor") 
     operator fun invoke(db: Database, handler: (transaction:  Transaction) -> Any) = MyClass(db, Handler<Transaction>({ handler.invoke(it) })) 
    } 
} 

使用して、 "シミュレート" コンストラクタができ、使い方は次のようになります。

fun main(args: Array<String>) { 
    val db = Database() 

    MyClass(db, Handler { }) //real constructor 
    MyClass(db){ } //version from companion object 
} 
関連する問題