2017-05-06 6 views
2

In einem Projekt, an dem ich gerade arbeite, habe ich festgestellt, dass ich einige Erweiterungsmethoden für einige Typen schreibe, um einen Standardwert zurückzugeben, wenn ein optionales NULL ist.Wie schreibe ich eine generische Erweiterungsmethode in Kotlin?

Zum Beispiel kann ich einen Boolean? Gegenstand habe, und ich möchte es in einem bedingten Ausdruck falsch vorbelegt verwenden, also würde ich schreiben:

if (myOptional?.default(false)) { .. } 

ich dies für ein paar Typen geschrieben habe:

fun Boolean?.default(default: Boolean): Boolean { 
    return this ?: default 
} 

fun Long?.default(default: Long): Long { 
    return this ?: default 
} 

fun Int?.default(default: Int): Int { 
    return this ?: default 
} 

ich frage mich, ob es einen Weg, dies allgemein zu tun, so kann ich eine Erweiterungsmethode schreiben, die ich für alle Arten verwenden kann?

+2

Was ist der Sinn? Warum nicht '?:' Direkt verwenden? Es ist sowohl Standard als auch prägnanter. –

+0

.... Ich habe keinen wirklichen Grund, ich denke, lol. Es war nur eine persönliche Präferenzroute, die ich anfing nach unten zu gehen. – AdamMc331

+1

Bitte beachten Sie, dass "?." In der "if" ist ein Überschuss – voddan

Antwort

5

Ich würde das nicht tun, und den Standard-Operator ?: verwenden, den jeder Kotlin-Entwickler wissen sollte, und das ist prägnanter.

Aber um Ihre Frage zu beantworten:

fun main(args: Array<String>) { 
    val k1: Long? = null 
    val k2: Long? = 4L 

    println(k1.default(0L)) // prints 0 
    println(k2.default(0L)) // prints 4 
} 


fun <T> T?.default(default: T): T { 
    return this ?: default 
} 
+1

Danke! Ich stimme zu, war wahrscheinlich nicht der richtige Weg zu gehen, aber danke für die Beantwortung der Frage. Ich war wirklich verloren beim Erstellen einer generischen Erweiterungsmethode, aber das half mir dabei, also überlasse ich die Frage. Jemand könnte in Zukunft ein nützlicheres Bedürfnis haben, haha – AdamMc331

2

Sie können eine Methode erstellen, dies zu tun und es ist unten, obwohl ich nicht bekommen, warum sollten Sie eine Methode für das wollen? Sie können im Grunde nur ?: direkt verwenden. Es ist sowohl lesbarer als auch kompakt.

Erweiterungsfunktion:

fun <T> T?.default(default: T): T { 
    return this ?: default 
} 
Verwandte Themen