加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

通用方法中的Java有界参数

发布时间:2020-12-14 05:13:00 所属栏目:Java 来源:网络整理
导读:我通过泛型方法测试了有限参数,发现了一些奇怪的行为. 这将是伟大的如果有人可以解释下面的代码片段中的两个错误. 想象一下,Class1和Class2有两个类从BaseClass扩展. Class2实现了一个接口. 在Class1中,我有一个方法可以通过以下方式返回Class2的一个实例:
我通过泛型方法测试了有限参数,发现了一些奇怪的行为.
这将是伟大的如果有人可以解释下面的代码片段中的两个错误.

想象一下,Class1和Class2有两个类从BaseClass扩展. Class2实现了一个接口.

在Class1中,我有一个方法可以通过以下方式返回Class2的一个实例:

public class Class2 extends BaseClass implements Interface {

    @Override
    public void method() {
        System.out.println("test"); //$NON-NLS-1$
    }
}

public class Class1 extends BaseClass {

    public <T extends BaseClass & Interface> T getTwo() {
        return new Class2();
        // Error: Type mismatch: cannot convert from Class2 to T
    }

    public static void main(String[] args) {
        Interface two = new Class1().getTwo();
        // Error: Bound mismatch: The generic method getTwo() of type Class1 is
        // not applicable for the arguments (). The inferred type Interface is
        // not a valid substitute for the bounded parameter <T extends BaseClass
        // & Interface>
        System.out.println(two);
    }
}

解决方法

出现第一个编译错误是因为方法声明的类型参数由调用者指定,而不是方法实现.也就是说
class Class3 extends BaseClass implements Interface { ... }

一个来电者可以写

Class3 c3 = new Class1().<Class3>getTwo();

,但是方法实现返回一个Class2,它不是T = Class3的子类型.

发生第二个编译错误是因为调用者未明确指定的类型参数是从方法参数和方法返回值分配给变量的类型推断的.这个推论在这里失败了. Java语言规范推荐的常见解决方法是在这种情况下明确指定类型参数(类型推断是为了方便简单的情况;它不旨在涵盖所有情况).

至于如何正确声明这个类型的参数,我需要知道你正在尝试用这些声明完成什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读