2017-03-01 3 views
-4

Wenn ich diesen Code ausführen die Ausgabe (MyInt @ 15db9742) -Objekt Adresse-:Aufschalten toString(), aber der Datentyp Integer

public static void main(String[] args) { 
    MyInt myInt = new MyInt(2); 
    System.out.println(myInt); 
} 

class MyInt { 
    public int val; 
    public MyInt(int val){ 
     this.val = val; 
    } 
} 

Was ich will, ist zu tun: das val zu drucken, ohne myInt.val

Ich habe versucht, toString() zu überschreiben ?!

public String toString(){ 
    return ""+val; 
} 

und es funktioniert! Aber ich mag, dass der Rückgabetyp int/Integer NICHT String sein, und es gibt einen Compiler-Fehler

Der Rückgabetyp mit Object.toString unvereinbar ist()“

, wenn ich den Rückgabetyp ändern zu int gibt es eine Möglichkeit, das zu tun

EDIT:.?

Kurz:

Integer integer = new Integer(5); 
int INT = integer; 
System.out.println(INT); 
So

Ich will myClass "MyInt" funktioniert wie Klasse "Integer" so kann ich int val direkt zuweisen

MyInt myInt = new MyInt(5); 
int INT = myInt; // I don't need to type "myInt.val" 
System.out.println(INT); 
+2

Warum möchten Sie den Rückgabetyp ändern? Wenn Sie eine Methode wünschen, die ein 'int 'zurückgibt, machen Sie einfach eine andere Methode. – resueman

+9

Nein. Der ganze Punkt von toString() 'besteht darin, eine Klasse ** in einen String ** umzuwandeln. – azurefrog

+0

Ich möchte das (int val) zurückgegeben werden, wenn ich das Objekt myInt aufrufen. Zum Beispiel: String s = new String ("Hallo"); Druck (e); es wird "Hallo" nicht die Adresse – AndroidDev

Antwort

1

scheinen Sie falsch verstanden zu haben, was hinter den Kulissen passiert, wenn man dies nennen:

System.out.println(myInt); 

Die println Methode nimmt ein Object Argument und ruft dann die .toString() Methode für das Objekt. Die Methode toString() gibt immer eine Zeichenfolge zurück. Was Sie getan haben (eine Zeichenkette zurückgeben) war also korrekt.

Beachten Sie, dass, wenn Sie dies tun:

System.out.println(1); 

dann gibt es eine Überlastung von println speziell für int Argumente. Aber Sie können ein Objekt nicht an println übergeben und erwarten, dass es als primitiver Typ behandelt wird.

+0

Also, wenn ich ein Objekt von "Integer i = new Integer (3); System.out.println (i);" es gibt tatsächlich i.toString() zurück? – AndroidDev

+0

In der Tat. Siehe [Quellcode] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/PrintStream.java#PrintStream.print%28java.lang .Object% 29) –

6

Das ist falsch an einem konzeptionellen und Code Qualitätsniveau.

Die Methode heißt toString().

Jeder Java-Programmierer weiß, was dieses Ding tun soll (um eine Zeichenkette Darstellung des Objekts, das Sie es nennen) zu liefern.

Jeder Java-Programmierer erwartet, dass diese Methode String zurückgibt, und kein int.

Lange Rede, kurzer Sinn: Anstatt existierende Methoden zu überschreiben und ihr Verhalten völlig zu ändern (was übrigens eine super schlechte Idee ist): füge einfach deine eigene, neue Methode hinzu und gebe dem einen vernünftigen Namen.

Endlich: was Sie im Sinn haben (Ändern des "Vertrags" der Methoden) ist meistens eine Verletzung der Liskov Substitution Principle. Bedeutung: Dinge nicht tun, weil Sie könnte tun sie. Stattdessen lernen und verstehen Sie die Konzepte, die Sie verwenden möchten. Was ich sage: richtige Vererbung in guten OO-Designs ist viel mehr als einige setzen erweitert Schlüsselwort irgendwo; und einige @Override vor einer Methodendeklaration.

+0

Kein Kommentar! <><><> – AndroidDev

+1

Ich muss zugeben: Ich bin mir nicht sicher, was Sie mir mit Ihrem Kommentar mitteilen wollen. – GhostCat