Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';如果第一个接口定义了一个实现类,我会在另一个接口中将它用作参数吗?_Java - Fatal编程技术网

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作为参数类型。 正如我所说的,你是否愿意这样做是一个完全不同的问题,真正取决于你想做什么。 有一些关于泛型的好读物