この次の宣言はKotlinに合法です。
fun foo(): String = "foo_1"
fun <T> foo(): T = "foo_2" as T
バイトコードとして、我々はなっています。
public final static foo()Ljava/lang/String;
// signature <T:Ljava/lang/Object;>()TT;
// declaration: T foo<T>()
public final static foo()Ljava/lang/Object;
それはKotlinからこれらのメソッドの両方を呼び出すことも可能です。
私は、Javaからそれらのいずれかを呼び出すためにしようとしているときに問題があります:
ClassKt.foo()
あいまいな呼び出し。どちらの方法が一致し...
このような問題を回避するには?このような方法をどのように扱いますか?どのような3-サードパーティのカラットライブラリは同じ問題を持っている場合はどうなりますか?
上記の例では、合成のものです。
なぜそれがのような2つのメソッドを持つ...でJavaを開始するKotlinで動作します:
private static String test() {
return "";
}
private static <T> T test() {
return null;
}
コンパイル時にエラーになります。そして、Javaのために、これは明白なの一種である開発者は、これらの方法は、同じ型消去を持っているでしょう。しかし、これはによって課されたルールであるjavac
、ないでJVM
どこにこのコードが実行されます。だから、javac
持つように2つの方法を扱っていないだけで過負荷など、さまざまな戻り値の型を。まあは、kotlin
異なる言語であり、それは上で動作するので、JVM
(有効なバイトコードを期待していること)それが持つメソッドの処理ができます唯一の戻り値の型は、過負荷など、さまざまなものを。私は、バイトコードを見て、それが起こるかを理解するために、まだです。また、これは、一般的なコードのためにのみ動作しますので、型消去がkotlinの場合は若干異なっているかもしれようです。
Javaは失敗したから、このようなメソッドを呼び出して、なぜ今、物事は明らかです。Kotlinは、このためにきちんとしたソリューションを提供しています@JvmName("someDistinctName")
。私はこれがブリッジメソッドを作成すると仮定しても、私は、どちらか全くわからボンネットの下にどのようにこの作品ではないよ...まだ。
EDIT
@JvmName
バイトコードレベルでのメソッドの名前を変更します。