2016-08-18 19 views
5

Od strony Kotlin documentation:Proszę wyjaśnić ten fragment kodu pod względem kodu C#?

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

W powyższym fragmencie kodu, rozumiem wszystko, oprócz tego, że Class<T> rzeczy. Przypuszczam, że to jest C# równoważne z następujących:

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

I kod klient powie coś takiego:

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

Ale nie mogę być pewien, bo cały System.Type parametr wydaje się zbędny w powierzchnia generycznego parametru parametru T w definicji metody.

W tym samym miejscu na tej stronie, co to jest class.java w poniższym fragmencie?

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

Zakładam, że klasa Class w Javie jest podobna do System.Type więc jeśli chciał powiedzieć, typeof(Customer), można by powiedzieć Customer.class? Czy to jest poprawne?

Co to jest class.java?

+0

Typy ogólne Java nie są dostępne w czasie wykonywania. Musisz przekazać je jako parametry, jeśli metoda musi je znać. A 'class.java' jest dobrze udokumentowaną konstrukcją kompatybilności Kotlin. – chrylis

+0

Możliwy duplikat [jaki jest obiekt klasy (java.lang.Class)?] (Http://stackoverflow.com/questions/4453349/what-is-the-class-object-java-lang-class) –

+1

@ AndreasBrunnet Nie jest to odpowiedni duplikat; pytanie dotyczy ogólnego wymazania. – chrylis

Odpowiedz

7

Java ma Typ ogólny wymazanie: Rzeczywisty typ T nie jest dostępny do kodu w czasie wykonywania. Ponieważ Gson musi wiedzieć, jaki jest typ docelowej deserializacji, przekazanie go Class<T> jawnie identyfikuje.

Z kolei Kotlin ma nieco silniejszy system typów niż Java, a ponieważ funkcja jest wbudowana, kompilator wie, jaki jest typ ogólny (słowo kluczowe reified). Konstrukcja T::class.java informuje kompilator Kotlin o tym, jaki jest odpowiedni typ T, a następnie wstawia odwołanie do klasy do T.

Ta redefinicja inline jest zasadniczo syntaktycznym cukrem dla Kotlin, umożliwiając użytkownikom Kotlin przekazanie zakodowanej specyfikacji typu miejsca docelowego do wnioskowania kompilatora.