2016-11-24 2 views
0
java version "1.8.0_92" 

Ich versuche, eine generische Schnittstelle und eine Klasse, die es implementiert. Dies ist die Schnittstelle:Verwenden von generischen Schnittstellen und Klassen

interface UpdateDBListener<T> { 
    void onUpdateSuccess(T person); 
    void onUpdateFailure(String errMessage); 
} 
void updatePerson(T person, UpdateDBListener updateDBListener); 

Fehler:

error: cannot find symbol method getId() where T is a type-variable: T extends Object declared in class PeopleListModelImp 

Und das ist die Klasse, die implementiert es:

public class PeopleListModelImp<T> implements PeopleListModelContract<T> { 

@Override 
public void updatePerson(T person, UpdateDBListener updateListener) { 
    String id = person.getId(); /* ERROR */ 
} 

Die Klasse I in dieser Geschichte in bin mit:

public class Person { 
    String mId; 
    String mFirstName; 
    String mLastName; 

    public Person() { 
    } 

    public String getId() { 
     return mId; 
    } 

    public void setId(String id) { 
     this.mId = id; 
    } 

    public String getFirstName() { 
     return mFirstName; 
    } 

    public void setFirstName(String firstName) { 
     this.mFirstName = firstName; 
    } 

    public String getLastName() { 
     return mLastName; 
    } 

    public void setLastName(String lastName) { 
     this.mLastName = lastName; 
    } 
} 

Allerdings, wenn ich es versuche Holen Sie sich die Id in der Klasse, die die Schnittstelle I auf dieser Linie einen Fehler implementiert:

String id = person.getId(); 

ich als Person denken, wissen es nicht eine Person-Klasse, so dass nicht die getId nicht versteht(). Ich frage mich nur, ob ich das falsch mache. Ich möchte, dass die Klasse komplett generisch ist, damit ich sie für andere Klassen verwenden kann.

Ist das möglich?

Vielen Dank im Voraus.

+0

'" Ich bekomme einen Fehler in dieser Zeile: ... "' - welcher Fehler? Sie waren lange genug hier, um zu wissen, dass Sie diese wichtige Information, die vollständige Fehlermeldung, notieren sollten. –

+0

Auch Ihre Schnittstelle und die von der Klasse implementierte Schnittstelle sind völlig anders? –

+0

Was möchten Sie genau machen? Kann ich Ihre main() -Methode sehen? –

Antwort

2

Es sieht aus wie Sie

public class PeopleListModelImp<T> implements PeopleListModelContract<T> { 

zu

public class PeopleListModelImp<T extends Person> implements PeopleListModelContract<T> { 

So ändern möchten, dass T weiß, dass es entweder eine Person oder eine Unterklasse der Person.


Auch sollte seine Genericity nicht

public void updatePerson(final T person, final UpdateDBListener updateListener) { 

so zu

public void updatePerson(final T person, final UpdateDBListener<T> updateListener) { 

geändert werden, dass das Verfahren nicht verliert?

Beachten Sie, dass Sie in der Zukunft Ihren Code in eine gültige MCVE verdichten möchten, so dass es für die Freiwilligen hier einfacher ist zu antworten. Ihr geposteter Code zum Beispiel enthielt nicht PeopleListModelContract.

+0

Ja, das war es was ich vermisst habe Danke. – ant2009

+0

@ Ant2009; Gern geschehen, und Entschuldigung, aber Ihre Frage hätte besser gestellt werden können. Bitte beachten Sie die Kommentare. Ihre Hilfe bei zukünftigen Fragen wird von den Freiwilligen, die hier helfen, sehr geschätzt. –

+0

Ich bin dankbar für die Kommentare, die Sie gegeben haben und die Hilfe, die Sie gegeben haben, um das Problem zu lösen. Ich beginne gerade mit Generika und das wird helfen. – ant2009

Verwandte Themen