Java 为什么可以';如果第一个接口定义了一个实现类,我会在另一个接口中将它用作参数吗?
我有两个接口。第一:Java 为什么可以';如果第一个接口定义了一个实现类,我会在另一个接口中将它用作参数吗?,java,Java,我有两个接口。第一: public interface IGoable { int go(); } 第二个使用第一个接口作为其方法定义中的参数类型: public interface IMove { int move(IGoable goThisMany); } 我有一个实现IGoable接口的类: public class ImplGoable implements IGoable { @Override public int go() {
public interface IGoable {
int go();
}
第二个使用第一个接口作为其方法定义中的参数类型:
public interface IMove {
int move(IGoable goThisMany);
}
我有一个实现IGoable接口的类:
public class ImplGoable implements IGoable {
@Override
public int go() {
return 0;
}
public int dumby() {
return 1;
}
}
问题出在这里。我在一个类中实现IMove接口,并尝试在实现的move()方法中使用IMPLAGABLE类作为参数,如下所示:
public class TestGoThere implements IMove {
@Override
public int move(ImplGoable goImp) {
return goImp.go();
}
}
public class TestGoThere implements IMove {
@Override
public int move(IGoable goImp) {
return goImp.go();
}
}
它给了我以下错误:
TestGoThere类型的方法move(不可执行)必须重写或
实现一个超类型方法
为了避免错误,我必须使用IGoable接口作为实现方法中参数的类型,如下所示:
public class TestGoThere implements IMove {
@Override
public int move(ImplGoable goImp) {
return goImp.go();
}
}
public class TestGoThere implements IMove {
@Override
public int move(IGoable goImp) {
return goImp.go();
}
}
为什么我不能使用ImplGoable类,因为它实现了IGoable接口?您不能使用
ImplGoable
来代替IGoable
,因为在您的声明中,您只与IGoable
接口建立了一个契约。ImplGoable
将实现并覆盖接口方法,但无法阻止它添加新方法。
由于您的约定,您只能使用界面中定义的方法,即go()
。因此,您可以使用goImp
对象,但只能在其约定范围内使用
这意味着对象可以是实现接口的任何有效对象,但类型必须是
IGoable
仅您可以使用泛型解决这个问题(尽管您是否希望完全取决于您的用例)
如果将接口的定义更改为:
public interface IMove<T extends IGoable> {
int move(T goThisMany);
}
公共接口IMove{
int-move(T-goThisMany);
}
这样,您就可以在实现接口的类中定义具体的实现,即:
public class TestGoThere implements IMove<ImplGoable> {
@Override
public int move(ImplGoable goImp) {
return goImp.go();
}
}
公共类testgot此处实现IMove{
@凌驾
公共int移动(不可容忍的goImp){
return goImp.go();
}
}
并允许您使用IMPLAGABLE作为参数类型。
正如我所说的,你是否愿意这样做是一个完全不同的问题,真正取决于你想做什么。
有一些关于泛型的好读物