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 { } 产生错误:
解决方法
在第一个代码中,T参数的作用域是方法:
<T extends A> Main(Function<T,Integer> f) { } 它使用目标的推断(客户端声明的类型返回)来确定T值. 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>并且编译失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |