我一直认为具有相同方法的两个接口不能被一个类继承,正如很多问题所述.
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”会获得一个信息不足的对象.