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

java – 将Bounded Generic Parameter理解为构造函数

发布时间:2020-12-15 08:26:59 所属栏目:Java 来源:网络整理
导读:我很困惑,为什么第一个代码片段编译但第二个不是? 我假设在两种情况下,通用参数T描述了相同的可能类型集,因此它们是等价的. 第一个例子 public class Main { static FunctionB,Integer f = (b) - 1; Main() { this(f); } T extends A Main(FunctionT,Intege
我很困惑,为什么第一个代码片段编译但第二个不是?

我假设在两种情况下,通用参数T描述了相同的可能类型集,因此它们是等价的.

第一个例子

public class Main {

    static Function<B,Integer> f = (b) -> 1;

    Main() {
        this(f);
    }

    <T extends A> Main(Function<T,Integer> f) {

    }

}

class A {    }

class B extends A {    }

第二个例子:

public class Main<T extends A> {

    static Function<B,Integer> f = (b) -> 1;

    Main() {
        this(f);
    }

    Main(Function<T,Integer> f) {

    }

}

class A {    }

class B extends A {    }

产生错误:

The constructor Main <T>(Function<B,Integer>) is undefined

解决方法

在第一个代码中,T参数的作用域是方法:

<T extends A> Main(Function<T,Integer> f) {

}

它使用目标的推断(客户端声明的类型返回)来确定T值.
因此它只能编译,而第一种类型的函数是A或A的子类,以尊重< T extends A>约束.
例如,声明这些其他类:

class B extends A {    }

class C extends A {    }

class D extends B {    }

这些也有效:

static Function<B,Integer> fb = (b) -> 1;
static Function<C,Integer> fc = (b) -> 1;
static Function<D,Integer> fd = (b) -> 1;

在第二个代码中,您想要传递函数< B,Integer>声明变量到Main构造函数,该构造函数依赖于类的T泛型类型:

public class Main<T extends A> {

    Main(Function<T,Integer> f) {

    }

}

问题是这里T可以是A,B或A的任何其他子类,根据类的客??户端使用的泛型类型.?所以函数< B,整数>不能分配给函数< T,Integer>并且编译失败.

(编辑:李大同)

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

    推荐文章
      热点阅读