2014-04-03 12 views
5

Wenn ich die byte zu int ändern, erhalte ich einen Compilerfehler. Können Sie das Problem erklären?Warum erhalte ich einen Kompilierungsfehler, wenn ich versuche, zwei Methoden mit demselben Namen und Parametertyp zu verwenden?

public class A { 
    protected int xy(int x) { return 0; } 
} 

class B extends A { 
    protected long xy(int x) { return 0; } //this gives compilor error 
    //protected long xy(byte x) { return 0; } // this works fine 
} 
+2

Weil die Methodensignatur von 'A.xy' die gleiche wie' B.xy' ist: gleicher Name, gleiche Anzahl von Parametern und gleicher Typ von Parametern. –

+0

Ihre Methoden, wie sie im Text gepostet werden, sind absolut in Ordnung, weil sie ** verschiedene ** Parametertypen haben. 'int' ist ** nicht ** dasselbe wie'byte' –

+0

@GermannArlington: Wenn Sie nur den Titel und den Code gelesen haben, ist es ein wenig verwirrend, aber die erste Zeile der * Frage * macht es klar: *" fi change Das Byte zu int bekomme ich einen Compilerfehler. "* –

Antwort

6

Wenn ich die byte zu int ändern bekomme ich einen Compiler-Fehler.

Wenn Sie das tun, haben Sie diese:

public class A { 
    protected int xy(int x) { return 0; } 
} 

class B extends A { 
    protected long xy(int x) { return 0; } 
} 

... und der einzige Unterschied in den xy Methoden ist ihre Rückgabetyp. Methoden können nicht allein durch ihre Rückgabetypen unterschieden werden, so ist Java definiert. Stellen Sie sich Folgendes vor:

myInstance.xy(1); 

Welche xy sollte das anrufen? long xy(int x) oder int xy(int x)?

Wenn Ihr Ziel zu Überschreibungxy in B ist, dann müssen Sie dessen Rückgabetyp int machen, um A#xy anzupassen.

2

Sie können nicht zwei Methoden mit derselben Signatur in einer Klasse verwenden, obwohl die Methoden separat in verschiedenen Klassen in derselben Vererbungsstruktur platziert werden. d. h. Basisklasse und Unterklasse

Hinweis: Nur Rückgabetypen können den Compiler nicht dazu bringen, den Unterschied in den Methoden zu verstehen. Rückgabetyp ist NICHT in der Methodensignatur enthalten

1

Das liegt daran, wenn Sie Byte in int ändern Sie haben Methode mit der gleichen Signatur in Basis-und Unterklasse (gleicher Methodenname und Parametertyp) und daher Rückgabetyp sollte genauso sein. Weil es nicht (int und lang) gibt es Ihnen

1

Sie können Methoden nur durch Parameter und Namen unterscheiden.

 both methods are in same class B 

    b.xy(byte x) or b.xy(int x) is called for input xy(0) or xy(1) 
0

Denn wenn man die byte in int die Instanz ändern, die die Methodenaufrufe nicht weiß, welche Methode gemeint ist. Der Überschriebene oder der Alte?

Aus diesem Grund ist es nicht erlaubt, die gleichen Signaturen (Methodenname, Art der Parameter und Anzahl der Parameter) zu haben. Nur als Information: Der Rückgabetyp ist nicht Teil der Signatur.

1

Overiding Methode sollte eine Art zurück, die für die Art von überschriebenen Methode zurückgegeben ersetzt werden kann

2

Sie versuchen, zwei Methoden mit dem gleichen Namen und Eingabeparameter zu schreiben, das ist nicht möglich.

Blick auf die folgenden zwei Methoden:

float met(){ 
    return 4.5; 
} 

double met(){ 
    return 5.4; 
} 

Wenn wir diese Linie dann

schreiben würde
int x = (int)met(); 

welche Methode würde genannt werden?

Es ist nicht möglich zu entscheiden, daher ist diese Situation nicht erlaubt.

Verwandte Themen