2016-07-25 3 views
-6
public enum MaritalStatus 
{ 
    Single, Divorcee, Married 

} 

public class Person 
{ 
    protected int ID; 
    protected String FirstName; 
    protected String LastName; 
    protected MaritalStatus Status; 
    protected int Age; 

    public Person(int id,String firstname,String lastname,MaritalStatus status,int age) 
    { 
     ID=id; 
     FirstName=firstname; 
     LastName=lastname; 
     Status=status; 
     Age=age; 
    } 
    public String toString() 
    { 
     return System.out.println("ID: "+ID + " First Name: "+FirstName+" Last Name: " +LastName+" Marital Status: "+ StringStatus +" Age: "+Age); 
    } 
} 

Person.java:19: error: incompatible types: MaritalStatus cannot be converted to String 
     return System.out.println("ID: "+ID + " First Name: "+FirstName+" Last Name: " +LastName+" Marital Status: "+ (String)Status +" Age: "+Age); 
                                  ^
1 error 
+2

Erste Dinge zuerst, [Namenskonventionen] (http://java.about.com/od/javasyntax/a/nameconventions.htm). Dann, http://stackoverflow.com/questions/6667243/using-enum-values-as-string-literals. – Idos

+1

So zeigt der Pfeil in der Fehlermeldung genau auf das Problem. Aber du hast diesen Code nicht gepostet, du hast einen anderen gepostet, der das Problem nicht hat. – Tunaki

+0

Woher kommt 'StringStatus'? Es sollte wahrscheinlich 'status.toString()' sein –

Antwort

2

Nein gibt es keinen "Fehler in der Enum-Klasse". Sie haben Probleme in der toString (siehe unten). Sie müssen wahrscheinlich die folgenden

public String toString() { 

    return "ID: "+ID + " First Name: "+FirstName+" Last Name: " +LastName+" Marital Status: "+ Status +" Age: "+Age; 
} 

Probleme:

  • Sie können nicht zurück System.out.println(…) (es gibt void zurück, es funktioniert nicht "print-and-Return-the-string")
  • zu Holen Sie sich eine bezeichnung Version für status verwenden Sie einfach status in diesem Zusammenhang (Sie verwenden + auf String) oder status.toString() in anderen Kontexten (wo String Typen erwartet werden).

Andere (nicht verwandten) Probleme

  • Felder/Variablen/Parameter in Java normalerweise Klein starten (id, firstName etc)
  • Felder sind in der Regel private und nicht protected
  • die meisten Menschen bevorzugen Räume Um die Operatoren wie Zuordnungen (a = b)
  • (IMHO) verwenden Sie final w hen Sie (wie val, const in anderen languages`) können
  • Enum Felder sind in der Regel in Großbuchstaben (SINGLE, MARRIED)

hier eine (mehr) die richtige Version Ihrer Klasse ist:

public class Person { 
    private int id; 
    private String firstName; 
    private String lastName; 
    private MaritalStatus status; 
    private int age; 

    public Person(final int id, final String firstName, final String lastName, final MaritalStatus status, final int age) { 
     this.id = id; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.status = status; 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + 
       "id=" + id + 
       ", firstName='" + firstName + '\'' + 
       ", lastName='" + lastName + '\'' + 
       ", status=" + status + 
       ", age=" + age + 
       '}'; 
    } 
} 

ps Ich nehme an, das ist kein Produktionscode, denn ein Feld mit dem Namen age ist ein bisschen peinlich

0

Ich kann zwei Kompilierungsfehler sehen, plus einen großen Haufen von Stilfehlern.

Diese Zeile:

return System.out.println("ID: "+ID + " First Name: "+FirstName+ 
    " Last Name: " +LastName+" Marital Status: "+ StringStatus + 
    " Age: "+Age); 

1) Die Variable StringStatus wurde nicht deklariert.

1a) Sie haben das dann zu (String) Status geändert, was auch falsch ist, weil Sie kein MaritalStatus zu einem String werfen können. (Aber Sie können toString() auf nennen ....)

2) Die println Methode ist eine Methode, die void kein String zurückgibt.

Der primäre Stil Fehler ist:

  • Feldnamen mit einem Großbuchstaben sollen nicht gestartet werden.
  • Ihre Verwendung von Leerzeichen vor/nach Token ist nicht standardkonform und inkonsistent. Setzen Sie ein einzelnes Leerzeichen vor und nach Infix-Operatoren wie + und =. Keine Leerzeichen vor einer , und einem Leerzeichen nach.
  • Die Verwendung einer Zeile mit mehr als 150 Zeichen ist nicht Standard ... und macht Ihren Code schwer lesbar. Für maximale Lesbarkeit sind maximal 80 Zeichenzeilen am besten geeignet.
  • Das Einrücken um 8 Felder ist zu groß.
  • Felder sollten private nicht protected sein.

    Dies ist mehr als nur Stil. Wenn Sie kein Feld als private deklarieren, könnte eine Unterklasse oder (schlechter) ein anderer nicht verwandter Code möglicherweise den Wert des Feldes beeinträchtigen. Das bedeutet, dass Sie viel mehr Code lesen müssen, um zu verstehen, was passieren könnte, wenn Sie einen Fehler aufspüren (zum Beispiel). Mit private hilft den Typ zu verkapseln, der den Code leichter zu lesen und einfacher zu verstehen macht.

IMO, die beste Art und Weise mit Parameternamen und Feldnamen zu befassen, die die gleiche (zB in einem Konstruktor) sind, ist wie folgt:

public class Person { 
    protected int id; 

    public Person(int id) { 
     this.id = id; // Use 'this' to disambiguate the two meanings 
         // of the 'id' identifier. 
    } 
} 

1 - Leider sind einige "hilfreiche" Person hat eine Menge davon korrigiert, um den Code in Ihrer Frage lesbar zu machen. Bitte beziehen Sie sich auf die Sachen, die Sie ursprünglich gepostet haben.