gpt4 book ai didi

Java - 两个具有相同方法的接口(interface),一个只是通用的

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:52 24 4
gpt4 key购买 nike

我一直认为,同一个方法的两个接口(interface)不能被一个类继承,很多so问题都说了。

Java jre 7, jdk 1.7

但是这里的代码是有效的。

例子:

接口(interface):

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;
}
}

这两个方法声明不是有相同的主体吗?

异常(exception)情况:

异常只是添加到这个构造中,使其更加复杂。

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

它也可以正常工作而不会抛出任何异常。

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

为什么会这样?

编辑:

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
}
}

最佳答案

Now i could cast UserLogic to any of the two interfaces and retrieve a different set of exceptions!

不,你不能。请参阅 Joshua Bloch 和 Neal Gafter 的“Java Puzzlers:Traps、Pitfalls 和 Corner Cases”,Puzzle 37 Exceptionally Arcane:

Each interface limits the set of checked exceptions that method can throw. The set of checked exceptions that a method can throw is the intersection of the sets of checked exceptions that it is declared to throw in all applicable types, not the union.

所以在你的案例实现中

create(User user) throws ExceptionInherit

是正确的。但是

create(User user) throws ExceptionSuper

不会编译

关于Java - 两个具有相同方法的接口(interface),一个只是通用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com