Java Generics Name Konflikt, Methode nicht korrekt überschrieben

8

Ich habe verschiedene Fragen diesbezüglich gesehen, aber ich finde das Thema immer noch sehr verwirrend.

Alles, was ich tun möchte, ist eine abstrakte Klasse, die eine Schnittstelle implementiert, und eine Klasse, die diese abstrakte Klasse erweitert, so dass die harte Klasse getKommune() und setKommune(Kommune kommune) implementieren muss, aber nicht die andere Methode, weil das ist in der abstrakten Klasse.

Ich habe die folgende Schnittstelle.

%Vor%

Und diese abstrakte Klasse

%Vor%

Und ich möchte es so benutzen

%Vor%

Allerdings bekomme ich

%Vor%

Warum wird es nicht korrekt überschrieben?

UPDATE

Dank @Bozho ist die Lösung das:

%Vor%     
Shervin Asgari 30.03.2010, 09:02
quelle

2 Antworten

4

Ich würde vorschlagen, das Interface generisch zu machen und nicht nur seine Methode:

%Vor%

Und dann

%Vor%     
Bozho 30.03.2010, 09:20
quelle
2

Der Grund dafür, dass es sich um einen Namenskonflikt und nicht um eine Überschreibung handelt, liegt darin, dass dies nicht der Fall ist. Die von der Schnittstelle angegebene Methode ist eine generische Methode. Der Versuch Ihrer abstrakten Klasse, sie zu überschreiben, ist dies nicht.

Ein kürzerer Code, der Ihr Problem reproduziert, ist dies:

%Vor%

Das Problem hier ist, dass interface I angibt, dass die Implementierer eine generische Methode <E>foo bereitstellen müssen (es kann ein <Integer>foo , <Boolean>foo , usw. sein), aber ein C<String> hat wirklich nur foo(String) .

Eine Möglichkeit, dies zu beheben, besteht darin, C.foo zu einer generischen Methode zu machen, um @Override zur generischen Methode von interface I :

zu machen %Vor%

Sie können sehen, was das im obigen Code tut: Sie haben einen generischen Typ C<E> mit einer generischen Methode <T>foo (Sie können E anstelle von T verwenden, aber das würde nichts ändern - - Es ist immer noch eine generische Methode mit einem eigenen Typparameter.

Jetzt hat C<String> auch <Integer>foo , usw., wie von interface I angegeben.

Wenn das nicht etwas ist, das Sie brauchen, dann möchten Sie wahrscheinlich interface I<E> generic machen:

%Vor%

Jetzt teilen sich der Typ und die Methode den gleichen Typparameter (zB hat ein I<Boolean> nur ein foo(Boolean) , ein C<String> hat nur ein foo(String) ) was wahrscheinlich das ist, was Sie ursprünglich beabsichtigt hatten.

    
polygenelubricants 30.03.2010 09:40
quelle

Tags und Links