接口默认方法冲突

如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,就会产生一个二义性错误.对于解决这个问题,java提供了相对简单的规则.
1)超类优先.如果超类提供了一个具体方法,同名并且有相同参数的默认方法会被忽略
2)接口冲突.如果一个接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,必须覆盖这个方法来解决冲突

首先我们先看第二个规则:
//: 测试接口默认方法的冲突

interface Named {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "    Named"; 
}

interface Base {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "   Base";
    }
}

public class Test implements Base, Named {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.getName());
    }
}

如上述代码所见,Test类同时实现了两个有同名且参数相同的默认方法的接口.编译后产生如下错误:
这里写图片描述
类会继承Base和Named接口提供的两个不一致的getName方法.并不是从中选择一个,java编译器会报告一个错误,让程序员来解决这个二义性.只需要在Test类中提供一个getName方法.在这个方法中,可以选择两个冲突方法中的一个,如下所示:

//: 测试接口默认方法的冲突

interface Named {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "   Named";
    }
}

interface Base {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "   Base";
    }
}

public class Test implements Base, Named {
    //覆盖getName方法
    public String getName() {
        return Named.super.getName();
    }

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.getName());
    }
}

这里写图片描述
这样我们就能解决这个问题.
现在假设Named接口没有为getName提供默认实现:
Test类会从Base接口继承默认方法么?

//: 测试接口默认方法的冲突

interface Named {
    String getName();
}

interface Base {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "   Base";
    }
}

public class Test implements Base, Named {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.getName());
    }
}

这里写图片描述
我们可以看到编译器依然还是报错.
java设计者强调一致性.两个接口如何冲突并不重要.如果至少一个接口提供了一个实现,编译器就会报告一个错误,而程序员就要解决这个个二义性.
当然,如果两个接口都没有为共享方法提供默认实现,这里就不存在冲突.实现类可以有两个选择:实现这个方法,或者干脆不实现.如果不实现,那么这个实现类本身就是抽象的.

现在来考虑另一种情况,一个类继承了一个超类,同时实现了一个接口,并从超类和接口继承了相同的方法.

//: 超类与接口方法冲突

interface Named {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "    Named";
    }
}

class Base {
    public String getName() {
        return getClass().getName() + "_" + hashCode() + "   Base";
    }
}

public class Test2 extends Base implements Named {
    public static void main(String[] args) {
        Test2 t = new Test2();
        System.out.println(t.getName());
    }
}

output:
这里写图片描述
在这种情况下,只会考虑超类方法,接口的所有默认方法都会被忽略.这正是”类优先”原则.

参考资料:corejava

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Delphi 7中访问HTTPS接口时出现了地址冲突问题,这可能是由于以下原因导致的。 首先,Delphi 7是一个相对较旧的开发工具,其对HTTPS协议的支持可能不够完善。由于HTTPS协议需要加密和解密数据,而Delphi 7可能缺乏更新的加密算法和SSL库,导致无法正确处理HTTPS连接。 其次,地址冲突问题可能是由于您访问的HTTPS接口在使用的端口与其他程序或服务冲突。HTTPS默认使用443端口,如果其他程序已经占用了该端口,Delphi 7无法正确建立与HTTPS接口的连接。 解决这个问题的方法有以下几种。 首先,您可以尝试使用较新版本的Delphi或其他现代化的开发工具,这些工具通常具有更好的对HTTPS的支持,能够正确处理加密和解密等操作,从而避免地址冲突问题。 其次,您可以尝试在程序中更改访问HTTPS接口时使用的端口。您可以查询HTTPS接口的文档或联系接口提供商,了解是否可以使用其他端口进行访问,然后在Delphi 7的代码中相应地修改端口号。 最后,如果您无法更换开发工具或更改端口,您可以考虑使用第三方组件或库来弥补Delphi 7的不足。有一些开源的或商业的HTTPS组件可供选择,这些组件通常提供更好的对HTTPS的支持,可以解决地址冲突问题。 总之,Delphi 7访问HTTPS接口时出现地址冲突问题是由于其对HTTPS的支持不足或其他程序使用了相同的端口所致。通过升级工具、更改端口或使用第三方组件,您可以解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值