2013-07-29 8 views
5

Ist es möglich, einen Parameter x in einer Methode zu definieren, so dass der Typ von x ist ein generischer Typ T, die eine bestimmte Funktion Signatur implementiert (sagen wir def apply() : Double), ohne Einführung einer neuer Typ?Scala und Typ gebunden mit einer bestimmten Operation

[Beispiel] Das Ziel ist, wie etwas zu definieren (ich eine Ad-hoc-Syntax verwenden nur zum Zweck der Illustration):

def foo(x : T with def apply() : Double) = { ... }

Derzeit konnte ich eine neue Art einführen ApplyDouble, aber das erfordern würde mir alle möglichen Arten, deren Instanzen sind rechtliche Rahmenbedingungen zu ‚foo‘ erstreckt, und Unterschrift würde die foo dann in

def foo(x : ApplyDouble) = { ... }

Antwort

8

S gedreht werden ure, dann ist es möglich, mit einem Strukturtyp, und Sie haben auch bekam fast die Syntax rechts:

def foo(x: { def apply(): Double }) = x.apply 

Und dann:

scala> foo(() => 13.0) 
res0: Double = 13.0 

Oder:

scala> foo(new { def apply() = 42.0 }) 
res1: Double = 42.0 

Die Definition von foo gibt Ihnen eine Warnung über den reflektiven Zugriff, den Sie vermeiden können, indem Sie eine Import- oder Compiler-Option hinzufügen (wie in der Warnmeldung beschrieben).

Beachten Sie, dass beim Aufrufen von Methoden für einen Strukturtyp ein gewisser Mehraufwand erforderlich ist. Wenn Sie dies in einer engen inneren Schleife benötigen, sollten Sie Ihren Ansatz vielleicht etwas überdenken. In den meisten Fällen wird es wahrscheinlich keinen merklichen Unterschied machen.

+0

Danke. Genau das habe ich gesucht;) – leco