Probleme, wenn eine nicht generische Methode eine generische Methode überschreibtJava

Java-Forum
Anonymous
 Probleme, wenn eine nicht generische Methode eine generische Methode überschreibt

Post by Anonymous »

vor generisches wurde der Java-Sprache hinzugefügt, es gab eine Klasse Super , die definiert wurde als:

Code: Select all

class Super {
public Object transform(Object t) { ... }
public Object get() { ... }
}
Als Benutzer dieser Klasse kann ich einen Unterklasse-Sub aus Super :

Code: Select all

class Sub extends Super {
public Object transform(Object t) { ... } // override
// The following cases are also considered as method override.
// public String transform(Object t) { ... }
// public List transform(Object t) { ... }
// and so on.
public Object get() { ... } // override
}
Die Transformation und abrufen in sub Überschreiben Sie die Transformation und erhalten Sie in Super . Eines Tages wurde Generic in die Java-Sprache hinzugefügt, der Autor der Super -Klasse wollte sich wieder entwickeln. pre class = "Lang-Java PrettyPrint-Override">

Code: Select all

class Super {
public  T transform(T t) { ... }
public  T get() { ... }
}
Für die Rückwärtskompatibilität ermöglicht Java eine nicht generische Wenn Super in einen generischen Typ überarbeitet wird, müssen Benutzer von Super tatsächlich auch keinen Code ändern. In diesem Fall wird der RAW-Typ jedoch in Sub-Erweiterung Super .

Code: Select all

class Super {
public T transform(T t) { ... }
public T get() { ... }
}
< /code>

Definieren Sie nun eine Unterklasse von Super  < /code> - sub  < /code>: < /p>
class Sub extends Super {
public Object transform(Object t) { ... } // override
// The following cases are also considered as method override.
// public String transform(Object t) { ... }
// public List transform(Object t) { ... }
// and so on.
}
Die Transformation in sub hat die gleiche Signatur wie das Löschen der Transformation in Super . Dies fordert mich auf, zu beurteilen: Wenn eine GET () -Methode zu sub hinzugefügt wird, sollte sie auch die Get () -Methode in Super überschreiben . Während der Zusammenstellung stellte ich jedoch fest, dass es nicht nur nicht überschreibt, sondern auch zu einem inkompatiblen Rückgabetyp Fehler. Warum kann in diesem Fall die Methode get () in Sub dieselbe Löschungsregel anwenden, um Überschreibungen zu erreichen?

Code: Select all

// after adding get() method to Sub
class Sub extends Super {
public Object transform(Object t) { ... } // override
public Object get() { ... } // error: incompatible return type
}
< /code>
Schließlich überschreibt in der folgenden Code -Methode die Methode Get () in der Unterklasse die Get () -Methode in der Superklasse. Warum kann diese Regel nicht in dem Fall angewendet werden, in dem ich auf den Fehler gestoßen bin?class Super {
public  T transform(T t) { ... }
public  T get() { ... }
}

class Sub extends {
public Object transform(Object t) { ... } // override
public Object get() { ... } // override!
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post