2012-05-22 6 views
5

Ich mag würde Funktor Klasse wie diese haben:generic Funktor Klasse in Java

public class Functor<T, R> { 
    public R invoke(T a) { ... } 
} 

Und eine weitere Klasse für die 2 Argumente:

public class Functor<T1, T2, R> { 
    public R invoke(T1 a, T2 b) { ... } 
} 

Und so weiter.

In C# kann ich schreiben:

class Functor<T> { ... } 
class Functor<T1, T2> { ... } 

Aber in Java wäre es ein Fehler sein:

The type Functor is already defined 

Was sind Best Practices für die Multi-Argumente generische Klassen in Java?

+0

Keine Antwort auf Ihre Frage - aber sind Ihnen Bibliotheken wie http://functionaljava.org/ bekannt, die Ihnen eine Reihe von Funktoren und eine umfangreiche Bibliothek zur Verfügung stellen? – henry

Antwort

5

Da Generika in Java implementiert wird durch die Typinformationen zu löschen (in class C<T>, T geht weg in der kompilierten .class-Datei) gibt es keine Möglichkeit für den Compiler zu wissen, welche Klasse Sie zur Laufzeit sprechen.

Wenn Sie F<T1> und F<T1,T2> definieren und beide laden, kann eine Klasse C nicht die gewünschte Komponente identifizieren.

Dies ist der lange Weg zu sagen, ich glaube nicht, dass Sie das in Java tun können. : \

Was Sie vielleicht tun möchten, ist einfach ein einziges Argument Funktors haben F<T> und lassen T das Objekt, ein Pair<T1, T2> Objekt, ein ThreeTuple<T1, T2, T3> usw. Scala dies tut.

+1

danke! und welche Best Practice für die generischen Klassen mit mehreren Argumenten in Java? – user1312837

+0

Ich habe gerade die Antwort bearbeitet, um sie einzuschließen. Kurz gesagt wird in F T zu einem Argumenttyp, der 1 oder 2 oder 3 ... N Typen für Ihre Eingaben enthält. ZB F >. – Sam

+0

@sam - Formatierungstipp: Sie können Backticks (\) verwenden, um Inline-Codeformatierungen einzufügen, sodass Sie sich keine Gedanken über die Verwendung von < usw. machen müssen. Das funktioniert sowohl in Beiträgen als auch in Kommentaren. Oh und +1 –

0

Warum nennen Sie es einen Funktor? Wenn Sie sich die Definition von funktor in Wikipedia ansehen, werden Sie sehen, dass dies ein falscher Begriff ist.

In Scala wird dies Funktion genannt; und aufgrund der Besonderheiten von JVM und Bytecode gibt es viele Versionen, abhängig von der Anzahl: Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>, usw., bis zu Function22.

+1

Beantwortet die Frage nicht - sollte ein Kommentar sein. –