我有一个界面:
public interface InterfaceA {
public ArrayList<? extends Object> b();
public Object b(String string);
public void c(Object object);
}
实现它们时,前两种方法可以正常工作:
public class ClassA implements InterfaceA {
public ArrayList<SomeObject> b() {
...
}
public SomeObject b(String string) {
...
}
}
但我不能像这样实施第三个:
public void c(SomeObject object) {
...
}
有没有办法声明一个带有“generic”参数的方法来用不同的对象实现它?
答案 0 :(得分:2)
是。可以制作generic method。像,
public <T> void c(T object);
也可以制作通用接口。像,
public interface InterfaceA<T> {
public ArrayList<T> b();
public T b(String string);
public void c(T object);
}
然后实现可能看起来像
public class ClassA<T> implements InterfaceA<T> {
@Override
public ArrayList<T> b() {
// ...
}
@Override
public T b(String string) {
// ...
}
@Override
public void c(T object) {
// ...
}
}
答案 1 :(得分:1)
我们不能,因为如果方法参数不同,那就是重载。
我们最接近的是在类上声明一个类型参数:
public interface InterfaceA<T> {
public void c(T object);
}
public class ClassA implements InterfaceA<SomeObject> {
@Override
public void c(SomeObject object) {
object.foo();
}
}
class SomeObject {
void foo() {
System.out.println(1);
}
}
但这可能是也可能不是你所追求的。
协变方法参数的问题(据我了解你所问的)是这样的:
InterfaceA a = new ClassA();
// passing Object to method which actually
// expects a SomeObject
a.c( new Object() );
维基百科有一些有趣的话要说:Covariant method argument type。显然埃菲尔有它,这有点争议。