Java – 具有相同方法的两个接口,一个只是通用的

我一直认为具有相同方法的两个接口不能被一个类继承,正如很多问题所述.

Java jre 7,jdk 1.7

但这里的代码是有效的.

例:

接口:

public interface IObject
{
    public Object create(Object object) throws ExceptionInherit;
}

public interface IGeneric<T>
{
    public T create(T t) throws ExceptionSuper;
}

实施班级:

public class Test implements IGeneric<Object>, IObject
{
    @Override
    public Object create(final Object object) throws ExceptionInherit
    {
        return object;
    }
}

那两个方法声明不一样吗?

例外:

例外只是这个结构的附加物,使其更加复杂.

public class ExceptionSuper extends Exception {}
public class ExceptionInherit extends ExceptionSuper {}

它的工作原理没有任何抛出异常.

进一步:如果两个方法接口抛出不同的继承异常,我可以将UserLogic强制转换为两个接口中的任何一个,并检索异常的不同子集!

这为什么有效?

编辑:

The generic implementation is not even necessary:

public interface IA
{
    public void print(String arg);
}

public interface IB
{
    public void print(String arg);
}

public class Test implements IA, IB
{
    @Override
    public void print(String arg);
    {
        // print arg
    }
}

解决方法:

你绝对可以“实现”两个具有相同签名方法的接口.您在尝试“扩展”具有相同方法实现的两个类时遇到了麻烦.多接口继承是好的;多实现继承是TRICKY.

可以使用“ExceptionInherit”对象代替“ExceptionSuper”对象,因为它继承了它. “ExceptionInherit”对象具有“ExceptionSuper”对象所具有的所有信息(以及更多).反之亦然.您不能使用“ExceptionSuper”对象代替“ExceptionInherit”对象,因为“ExceptionInherit”代码需要的内容超过您的基础对象(嗯,可能但不是您的情况).

你的“create”方法的实现填充了ICreateUser“create”签名,因为它抛出一个“ExceptionInherit”,可以抛出“ExceptionInherit”和“ExceptionSuper”的捕获者获取他们需要的所有信息(只是基类)物体.

您无法更改实现以抛出“ExceptionSuper”,因为捕获者期望“ExceptionInherit”会获得一个信息不足的对象.

上一篇:Java ArrayList删除方法多态


下一篇:传递接口作为函数参数(PHP)?