Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用相同的方法签名实现多个接口_Java_Interface - Fatal编程技术网

Java 使用相同的方法签名实现多个接口

Java 使用相同的方法签名实现多个接口,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); 它看起来就像编译器说的:“好吧,我给你

提供给接口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);
它看起来就像编译器说的:“好吧,我给你留下了‘潜在性’中的模糊性,但当涉及到‘现实性’时,我会阻止你。”。而这些方法的“现实性”似乎来得更早


我说得对吗?我错过什么了吗?想象一个编译器像亚里士多德学派的人一样跟我说话,我会发疯吗?

不会。你可以把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);
    }