14 Stimmen

Ist es möglich, einen verschachtelten generischen Parameter in Java zu referenzieren?

Ich bin mir nicht sicher, wie der Fachbegriff dafür lautet, aber denken Sie an eine Schnittstelle:

public interface SomeInterface<T> {
     public T doSomething();
}

Und dann eine zweite Schnittstelle:

public interface SomeRelatedInterface<T, D extends SomeInterface<T>> {
     public T doSomethingRelated(D relative);
}

Ist es möglich, die zweite Schnittstelle so zu gestalten, dass nur ein generischer Parameter erforderlich ist, und dann die doSomethingRelated-Methode implizit den Rückgabetyp in ihrer Deklaration extrahieren zu lassen. Dies ist nicht legal, aber das ist, was ich frage mich, wenn in einigen anderen Mitteln getan werden kann:

public interface <T> SomeRelatedInterface<D extends SomeInterface<T>> {
     public T doSomethingRelated(D relative);
}

EDIT (beim Einstellen des Kopfgeldes): Was ich in dieser Frage suche, ist der Grund, warum die Sprache diese Verdoppelung erfordert. Das ist es, was in den Antworten bis jetzt gefehlt hat, um akzeptiert zu werden.

2voto

Daniel Moura Punkte 7678
public interface SomeRelatedInterface<T> {  
    T doSomethingRelated(SomeInterface<T> relative);
}

2voto

oxbow_lakes Punkte 131223

"Was ich in dieser Frage wissen möchte, ist der Grund, warum die Sprache diese Verdoppelung erfordert.

Nun, die Sprache erfordert, dass Sie in Ihrem Beispiel 2 Typparameter definieren, weil es in dem von Ihnen beschriebenen Problem 2 Typparameter gibt: Sie möchten, dass eine Methode sowohl im Typ T und auch bei der Durchführung von SomeInterface .

Diese sind orthogonale Überlegungen und daher brauchen Sie mehr als einen Typparameter, um sie zu repräsentieren.

Typparameter müssen natürlich nicht in einer Klasse/Schnittstelle definiert werden; sie können in einer Methode definiert werden. J-16 SDiZ Die Antwort auf diese Frage erlaubt es Ihrer verwandten Klasse/Schnittstelle, nur einen Typparameter zu haben. Der zweite Typparameter wird dann nur dort deklariert, wo er benötigt wird, nämlich in der doSomethingRelated Methode

1voto

Yishai Punkte 87548

Nun, ich habe ein Kopfgeld auf diese Frage ausgesetzt und wusste nicht, dass SOs Verhalten darin bestand, jemandem die Antwort zu geben (Glückwunsch Daniel). Tja.

Wie auch immer, ich habe endlich meine Antwort. Von aquí :

Aus Gründen der Abwärtskompatibilität gibt new Map() leider einen Rohtyp an und kann daher nicht für die Typinferenz verwendet werden.

Bei der Erstellung einer Klasse und der Übergabe des Typparameters wurde die Typinferenz deaktiviert, um Platz für den Rohtyp zu schaffen. In meinem Fall könnte es also eine Typinferenz geben, aber das wäre eine Frage einer komplexeren anderen Art von Typinferenz, um diesen Fall zu behandeln, was nicht gemacht wurde.

0voto

J-16 SDiZ Punkte 25675

Schauen Sie, ob das Ihren Bedürfnissen entspricht:

public interface SomeRelatedInterface<T> {
     public  <D extends SomeInterface<T>> T doSomethingRelated(D relative);
}

0voto

Daniel Schneller Punkte 13408

Da die Typparameter zur Kompilierzeit gelöscht werden, können Sie IMHO leider nicht erreichen, was Sie wollen, ohne T als zweiten Typparameter anzugeben, so wie Sie es in Ihrem ersten Beispiel getan haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X