2017-09-06 2 views
4

Aufruf habe ich eine Hilfsklasse Kotlin wie folgt definiert:eine Kotlin Funktion höherer Ordnung von Java

class CountdownTimer(endDateInSeconds: Long, callback: (timeRemaining: RemainingTime) -> Unit) 

die wie der Name, eine Epoche Zeit in Anspruch nimmt impliziert und einen Rückruf in festen Intervallen aufgerufen werden (Sekunden in diesem Fall) bis das Enddatum erreicht ist. RemainingTime ist eine Datenklasse, die bis zum Enddatum die Zeit (Sekunden, Minuten, Stunden usw.) enthält.

ich diese Klasse von Kotlin sauber verwenden:

 countdownTimer = CountdownTimer(endDate, { timeRemaining -> 
      var timeString = // format time remaining into a string 
      view?.updateCountdownTimer(timeString) 
     }) 

jedoch, wenn ich das nenne aus Java, ich bin einen unnötigen Rückgabewert in dem Rückruf zu schaffen gezwungen, auch wenn die anonyme Funktion eine Einheit Rückkehr gibt Typ (was in der Theorie ist das Äquivalent eines Java Rückgabetyp void):

 this.countdownTimer = new CountdownTimer(this.endDate, remainingTime -> { 
      var timeString = // format time remaining into a string 
      if (view != null) { 
       view.updateCountdownTimer(timeString); 
      } 
      return null; 
     }); 

Während technisch gesehen kein Problem, mit einem bedeutungslosen Rückgabewert zu tun, bieten von der Java Rückruf .. falsch scheint. Gibt es eine bessere Möglichkeit, diesen Rückruf in Kotlin auszudrücken?

Antwort

5

Unit ist ein object und entspricht nicht direkt void. Im Hintergrund wird sogar der Kotlin-Code am Ende des Callbacks return Unit.INSTANCE; enthalten. Es gibt keinen anderen Weg, als eine separate Schnittstelle zu definieren, die immer void zurückgibt.

Verwandte Themen