给出接口I1和I2
interface I1{int i=1; void foo();}
interface I2{int i=2; int foo();}
A类有没有办法实现它们?我无法正确实现foo方法,这是有道理的,因为在I1.foo()和I2.foo()中使用相同的输入参数不会让A类区分这两者。
但是常量“i”不是问题,只要你在尝试读取它时将A转换为其中一个接口:
System.out.println(((I2)new A()).i);
看起来好像是编译器说的:“好吧,我在'潜力'中会让你感到含糊不清,但是当谈到'现实'时,我会阻止你”。这些方法的“现状”似乎更早出现。
我是对的吗?我错过了什么吗?我只是想疯狂想象一个编译器像一个aristotelian一样对我说话吗?
答案 0 :(得分:4)
没有。您可以将Java中的接口视为契约。因为这些接口具有相同的方法名称(但不同的返回类型),所以没有一个类可以满足这两个合同。如果他们有不同的论据,那么答案就是肯定的。
答案 1 :(得分:4)
如果您使用的是Java 8,则可以执行以下操作:
interface I1 {
default void foo() {
//some default implementation
}
}
interface I2 {
default int foo() {
//some default implementation
}
}
public class SomeClass implements I1, I2 {
I2.super.foo();
}
答案 2 :(得分:0)
尝试实现多种接口,可以通过查找发现更好地解决。最大的优势是依赖关系和动态发现的解耦。
(我知道这并不针对理论化。)
class A {
private Map<Class<?>, ?> capabilities;
A() {
capabilities.put(I1.class, new I1() {...});
capabilities.put(I2.class, new I2() {...});
}
public <T> T lookup(Class<T> intf) {
Object obj = capabilities.get(intf);
if (obj == null) {
throw new OperationNotSupportedException(
"Interface not found: " + intf.getName());
}
return intf.cast(obj);
}