2016-08-18 12 views
5

: Yukarıdaki kod snippet'indeBu kod parçasını C# kodu açısından açıklar mısınız? <a href="https://kotlinlang.org/docs/reference/idioms.html#convenient-form-for-a-generic-function-that-requires-the-generic-type-information">Kotlin documentation</a> sayfasından

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

, bunu Class<T> şey dışında her şeyi anlıyorum.

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

Ve böyle birşey söyledin istemci kodu:: Ben şu C# eşdeğer olduğunu varsayalım

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

Ama bu bütün System.Type parametre içinde gereksiz görünüyor çünkü emin olamaz Metot tanımında jenerik tip parametresi T'un yüzü.

Ayrıca, bu sayfada aynı konumda, aşağıdaki snippet'te class.java nedir?

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

Java sınıfı Class Eğer typeof(Customer) söylemek istediğim eğer öyleyse System.Type benzer olduğunu varsayalım, sen Customer.class derdim? Bu doğru mu?

class.java nedir?

+0

Java genel türleri çalışma zamanında kullanılamaz. Yöntem bunları bilmesi gerekiyorsa, bunları parametre olarak geçirmelisiniz. Ve class.java' iyi belgelenmiş bir Kotlin uyumluluk yapısıdır. – chrylis

+0

Olası yinelenen [Sınıf nesnesi nedir (java.lang.Class)?] (Http://stackoverflow.com/questions/4453349/what-is-the-class-object-java-lang-class) –

+1

@ AndreasBrunnet İlgili bir kopya değil; soru genel silme ile ilgilidir. – chrylis

cevap

7

Java, genel tür silme işlemine sahiptir: Gerçek tür T, çalışma zamanında kodda kullanılamaz. Gson'un hedef serileştirme türünün ne olduğunu bilmesi gerektiğinden, Class<T>'u iletmek onu açıkça tanımlar.

Kotlin, diğer yandan, Java'dan biraz daha güçlü bir sisteme sahiptir ve işlev satır içi olduğundan, derleyici genel türün aslında ne olduğunu bilir (reified anahtar sözcüğü). T::class.java yapısı, T uygun türünün ne olduğunu ve T sınıf referansının satır içi satırını belirlemek için Kotlin derleyicisine söyler.

Bu satır içi şemadaki

Kotlin kullanıcıları derleyici'nın çıkarsama hedef Çeşidi kodlanmış şartname temsilci için izin esasen KOTLIN için sözdizimsel şekerdir.

İlgili konular