In C++ kann ich das Folgende tun:
template<typename T, typename V>
struct{
void operator()(T _1, V _2){
_2.foo( _1 );
}
};
die mich willkürlich entscheiden lässt, ein beliebiges Objekt zu verwenden, das eine Methode namens "foo" hat, die einen Typ "T" annimmt, ohne im Voraus den Argumenttyp der Funktion "foo" oder den Rückgabetyp der besagten Funktion anzugeben.
Wenn ich mir Scala anschaue, sehe ich Eigenschaften wie Funktion1 und spiele mit Funktionsdefinitionen wie
def foo[T<:{def foo():Unit}]( arg:T ) = //something
def bar( x:{def foo():Unit} ) = //something
def baz[T,V<:Function1[T,_]]( x:T, y:V ) = y( x )
Ich sehe mich selbst an und denke, warum kann ich nicht dasselbe tun? Warum gibt "baz" ein Any zurück? Kann es nicht den tatsächlichen Rückgabetyp zur Kompilierzeit ableiten? Warum muss ich den Rückgabetyp von "foo" deklarieren, wenn ich ihn vielleicht nicht einmal verwende?
Ich würde gerne Folgendes tun können
def biff[T,V:{def foo( x:T ):Unit}] = //something
o
def boff[T<:{def foo( x:Double ):_}]( y:T ) = y.foo _
Können Sie das tun, oder habe ich etwas übersehen? Oder wenn nicht, warum nicht?