在Java中实现具有特定类型的通用接口

时间:2017-05-14 13:02:59

标签: java generics

考虑以下通用接口:

interface Petlover<T>{
    void train(T somePet);
}

我知道可以为通用接口提供通用实现(例如,class MalePetLover<T> implements Petlover<T>)。但是我无法实现特定类型的接口:

class Dogperson implements Petlover<T> {
    int age;

    void train(String someDog){...};
}

编译错误为train(String) in Dogperson cannot implement train(T) in Petlover。处理这个问题的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

由于您希望train接受String,您的班级应该实施Petlover<String>

class Dogperson implements Petlover<String> {
    int age;

    public void train(String someDog) {...};
}

或者train()的{​​{1}}方法应该接受Dogperson参数,然后该类会实现Dog

答案 1 :(得分:3)

扩展泛型类的子类必须符合它在自己的声明中指定的类型。

您声明:class Dogperson implements Petlover<T> {,因此train()方法必须拥有此签名:void train(T someDog){...};

如果您想在子类中使用此签名:

void train(String someDog){...};

您必须通过将PetLover类指定为参数化类型来声明实现String的子类:

class Dogperson implements Petlover<String> {
     public void train(String someDog){...};
}

您可以指定任何参数,因为T派生自界面中的Object 例如,如果你想在子类中使用Dog作为类型,你可以写它:

class Dogperson implements Petlover<Dog> {
     public void train(Dog dog){...};
}

例如,如果你想拥有一只猫,你可以写下它:

class Catperson implements Petlover<Cat> {
     public void train(Cat cat){...};
}
相关问题