Java 使用相同的方法签名实现多个接口
提供给接口I1和I2Java 使用相同的方法签名实现多个接口,java,interface,Java,Interface,提供给接口I1和I2 interface I1{int i=1; void foo();} interface I2{int i=2; int foo();} 有没有办法让类a同时实现它们?我无法正确实现foo方法,这是有意义的,因为在I1.foo()和I2.foo()中具有相同的输入参数不会让类A区分这两种方法 但常量“i”不是问题,前提是在尝试读取某个接口时,您将其转换为: System.out.println(((I2)new A()).i); 它看起来就像编译器说的:“好吧,我给你
interface I1{int i=1; void foo();}
interface I2{int i=2; int foo();}
有没有办法让类a同时实现它们?我无法正确实现foo方法,这是有意义的,因为在I1.foo()和I2.foo()中具有相同的输入参数不会让类A区分这两种方法
但常量“i”不是问题,前提是在尝试读取某个接口时,您将其转换为:
System.out.println(((I2)new A()).i);
它看起来就像编译器说的:“好吧,我给你留下了‘潜在性’中的模糊性,但当涉及到‘现实性’时,我会阻止你。”。而这些方法的“现实性”似乎来得更早
我说得对吗?我错过什么了吗?想象一个编译器像亚里士多德学派的人一样跟我说话,我会发疯吗?不会。你可以把Java中的接口想象成契约。因为这些接口具有相同的方法名(但返回类型不同),所以没有一个类可以同时满足这两个契约。如果他们有不同的参数,答案是肯定的。如果您使用的是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();
}
尝试实现多个接口,最好通过查找发现来解决。最大的优势是解耦依赖关系和动态发现
(我知道这并不针对理论。)
A类{
私人地图能力;
(){
put(I1.class,新的I1(){…});
put(I2.class,新的I2(){…});
}
公共T查找(类intf){
Object obj=capabilities.get(intf);
if(obj==null){
抛出新操作NotSupportedException(
找不到接口:“+intf.getName());
}
返回内部铸件(obj);
}
那么字段“i”呢?它可以编译,但不允许创建类的实例A@Ph.Voronov在接口中?它不是一个字段,它是一个常量。是的,我是关于这个常量的。“接口I1{int i=1;}接口I2{int i=2;}类a实现了I1,I2{}”编译,但在尝试实例化a时发生编译错误。您通常不会访问实例上的常量。此外,编译并不能保证正确性。@Ph.Voronov这不完全正确。您可以实例化a,当尝试将“i”的值作为“a”的成员(从a本身内部或外部)读取时,会发生编译错误这可能会帮助您:
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);
}