使用通用接口和类

时间:2016-11-24 04:46:35

标签: java generics

java version "1.8.0_92"

我正在尝试创建一个通用接口和一个实现它的类。这是界面:

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

错误:

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

这是实现它的类:

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

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

我正在使用的课程:

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;
    }
}

但是,如果我尝试在实现接口的类中获取Id,则会在此行中出现错误:

String id = person.getId();

我认为由于人不知道它是一个Person类,所以不了解getId()。我只是想知道我这样做是不正确的。我希望这个类是完全通用的,所以我可以将它用于其他不同的类。

这可能吗?

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

看起来你想要改变

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

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

因此,T知道它是Person或Person的子类。

另外,不应该

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

改为

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

这样该方法不会失去其通用性吗?

请注意,将来,您希望将代码压缩为有效的MCVE,以便此处的志愿者更容易回答。例如,您发布的代码不包含PeopleListModelContract。