2010-03-30 6 views
8

Ich möchte eine Klasse erstellen, die zwei Parameter akzeptiert. Man sollte einfach als T getippt werden. Der andere sollte als etwas eingegeben werden, das sowohl T als auch SomeInterface<T> verlängert. Als ich dies versuchen, mitErweitern sowohl T als auch SomeInterface <T> in Java

public class SomeClass<T, S extends SomeInterface<T> & T> 

dann klagt Java mit

„Der Typ T ist keine Schnittstelle, es nicht als abgegrenzte Parameter angegeben werden kann“

und wenn stattdessen versuche ich, eine erstellen Schnittstelle für S mit

public interface TandSomeInterface<T> extends SomeInterface<T>, T 

dann klagt Java mit

"Kann nicht auf den Typparameter T als Supertyp verweisen"

Gibt es eine Möglichkeit, dies in Java zu tun? Ich denke du kannst es in C++ machen ...?

+2

Beachten Sie, dass C++ Vorlagen viel mächtiger sind als Java-Generika. Nur weil es in C++ gemacht werden kann, bedeutet das nicht, dass es in Java gemacht werden kann. –

+0

verwandt: http://Stackoverflow.com/a/13261667/697449 –

Antwort

3

Sie können keine Schnittstelle erstellen, die den Typparameter T erweitert, da es keinen Vertrag gibt, der T als Schnittstelle garantiert. Und natürlich ist die Erweiterung einer Klasse nicht erlaubt.

+0

Aber gibt es eine Möglichkeit, dies zu umgehen, um den gleichen Effekt zu erhalten? –

3

dies funktioniert, wenn Sie eine Schnittstelle als auch erweitern:

public class SomeClass<T extends I, S extends SomeInterface<T> & I> 

aber es ist vielleicht nicht genau, was Sie wollen ...