java 泛型 引用_Java嵌套自引用泛型

我有一个类,它有一个自引用的泛型参数和一个属于同一个超类的参数。静态函数与类具有相同的边界。

public class Bar, C extends Bar> {

Bar() {

foo((T) null);

foo((C) null);//compile error

}

static , S_C extends Bar> void foo(S_T t) {

}

}

这会产生以下错误。

Bound mismatch: The generic method foo(S_T) of type Baris not

applicable for the arguments (C). The inferred type C is not a valid

substitute for the bounded parameter >

我不明白为什么C不能传入foo(),因为C是Bar,通配符是Bar,因为声明中的第二个参数表示它扩展了条。

我知道这可能是一个坏主意,并产生了难以理解的代码,但我真的想知道为什么这不能编译。

可能与我的问题stackoverflow.com/questions/9937422/&hellip有关;

@判断有点类似;但根据我从您的问题中收集到的信息,编译失败的是类层次结构,而我的类层次结构编译失败的是函数的参数约束。

简短的答案是Java类型的推理实际上是相当蹩脚的。

在EDCOX1(10)的声明中,Java没有对通配符EDOCX1 9进行任何智能推理,以推断它在逻辑上是由EDCOX1〔11〕限制的(也不意味着EDCOX1在该约束中的9个S本身是有界的,等等)。一旦你把EDOCX1,9本身,这就是所有的Java知道。尽管没有任何东西阻止您在EDCOX1(10)中声明通配符,即使这样对Java也没有帮助;Java不会假设两个单独的EDCOX1×9个s指的是同一类型,即使更深的分析暗示它们必须是相同类型的。换句话说,即使使用以下代码,编译错误仍然存在:

public class Bar, C extends Bar>>> {

Bar() {

foo((T) null);

foo((C) null);//compile error

}

static , S_C extends Bar>>> void foo(S_T t) {

}

}

是的,我开始怀疑Java无法检测通配符边界之间的连接。我开始尝试提供一个类:Pie extends Bar,而不是通配符。那么函数将有, S_C extends Bar,其中一个函数仍然可以在bar上有返回s_c…的方法,但我现在可能完全偏离了目标(这里大约3点)。

作为foo的参数类型,Bar< S_T, S_C >有什么问题?关于foo中的S_T的唯一信息就是它无论如何都是Bar< S_T, S_C >。另外,这使得foo(理论上至少)更为普遍。

函数的通用参数是什么?你的意思是只定义s_t和s_c没有任何界限,因为参数中的bar与bar类的界限不匹配吗?

对,那没什么帮助。我突然想到,如果你想调用foo( ( C )null ),你也不关心foo中Bar的第二个参数,这意味着为什么不只调用static > void foo( S_T t ) {}?

好吧,这是可行的,这取决于你想做什么,因为如果你有一个通配符而不是s_c,你就不能调用new Bar()。

对于泛型,我不是一个裂缝,但我认为问题在于您将foo()的类型声明为

> void foo(S_T)

然后在两个不同的上下文中调用它,这些上下文要求foo()使用不同的静态类型。

在第一个上下文中,S_T具有T类型,在第二个上下文中,它具有C类型。但是,T和C被声明为Bar和Bar,它们是静态上不相容的类型。我想编译器会在第一次调用中找出foo()的类型,然后正确地假定该类型在整个过程中必须保持不变,而事实并非如此。

切换两个foo()调用的顺序仍然会在C行中产生错误。

好的,尝试在类声明中更改c和t的顺序,即do bar,t extends bar如果错误翻转,则意味着类型绑定还取决于类声明中类型的顺序。但是在这两种情况下,C和T都有不同的不兼容类型,并且不能将这两种类型都传递到foo()中。

我尝试了你建议的更改,但错误变为t,但我认为这仅仅是因为它重命名了参数,没有改变任何意义。我尝试了几种不同的方法来重新排序参数,但错误仍然存在于具有通配符的参数上。另外,我认为尽管c和t彼此不兼容,但两者都应该与静态函数兼容,因为afaik的通用参数是基于它每次调用所得到的输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值