考虑以下通用接口:
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
。处理这个问题的正确方法是什么?
答案 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){...};
}