2016-08-18 1 views
5

:上記のコードでC#コードの観点からこのコードを説明してください。 <a href="https://kotlinlang.org/docs/reference/idioms.html#convenient-form-for-a-generic-function-that-requires-the-generic-type-information">Kotlin documentation</a>ページから

// public final class Gson { 
//  ... 
//  public <T> T fromJson(JsonElement json, 
//       Class<T> classOfT) 
//       throws JsonSyntaxException { 
//  ... 

は、私はそのClass<T>もの以外のすべてを理解しています。私はそれが次のC#の同等であると仮定します。

public sealed class Gson 
{ 
    public T FromJson<T>(JsonElement json, 
         System.Type Type) 
    { 
    } 
} 

そして、クライアントコードは次のようなものだと思います:

var gson = new Gson(); 
var customer = gson.FromJson<Customer>(json, typeof(Customer)); 

をしかし、その全体System.Typeパラメータは、冗長と思われるので、私は確認することはできませんメソッド定義内のジェネリック型パラメータTのface

また、そのページの同じ場所にあるclass.javaは次のスニペットにありますか?

inline fun <reified T: Any> Gson.fromJson(json): 
       T = this.fromJson(json, T::class.java) 

私は、JavaのクラスClassSystem.Typeに似ていることを前提としていますが、typeof(Customer)を言いたかったのであれば、あなたはCustomer.classを言うだろうか?あれは正しいですか?

class.javaとはなんですか?

+0

Javaジェネリック型は実行時には使用できません。メソッドがそれらを知る必要がある場合は、それらをパラメータとして渡す必要があります。 'class.java'は、文書化されたKotlin互換性のある構造体です。 – chrylis

+0

[クラスオブジェクト(java.lang.Class)とは何か?](http://stackoverflow.com/questions/4453349/what-is-the-class-object-java-lang-class) –

+1

@ AndreasBrunnet関連する複製はありません。質問は一般的な消去に関するものです。 – chrylis

答えて

7

Javaは汎用タイプの消去:実際のタイプTは、実行時にコード化することはできません。 Gsonはターゲットの逆シリアル化タイプが何であるかを知る必要があるため、Class<T>を明示的に識別します。

一方、KotlinはJavaより幾分強力な型システムを持ち、そこに関数がインライン化されているため、コンパイラは汎用型が実際に何であるか知っています(reifiedキーワード)。構成T::class.javaは、Kotlinコンパイラに、適切なタイプTが何であるかを判断し、クラス参照をTにインライン化するように指示します。

このインラインの再定義は、Kotlinにとって本質的に構文上の砂糖であり、Kotlinユーザーは、宛先タイプのハードコードされた仕様をコンパイラの推論に委譲することができます。

関連する問題