我找到了代表Java泛型功能的Java code line,但我无法阅读和理解它。如何理解以下Java代码行?
public <T, F> ContractValidator<T extends Contract> T validate(Validator<T>, F object)
答案 0 :(得分:6)
好吧,我可以从中感受到一些困惑:泛型是 已破坏 。我并不是说打破了,“他们对了解泛型的人没有意义”;我的意思是打破,因为他们没有编译。因此,不要采取他们在字面值上所说的话;它只会让你更加困惑。
让我们从显而易见的开始吧。删除所有的泛型,我们留下了感知的原始类型。
public ContractValidator validate(Validator, Object object)
我删除了模糊的双重回报,因为它没有多大意义。我还假设他们想要第一个参数的变量......
public ContractValidator validate(Validator validator, Object object) {
return null;
}
所以我们得到的是一些Validator
和一些Object
进入这个validate
方法,我们得到的是ContractValidator
。
这很棒,除了我们可以验证任何东西(理论上)。如果我们的Validator
与特定事物的类型绑定要验证怎么办?
public <T extends Contract> ContractValidator validate(Validator<T> validator, Object object) {
return null;
}
表达式<T extends Contract>
将其转换为绑定泛型。更具体地说,它是upper bound;未使用Validator
或Contract
键入的任何____ extends Contract
类型都不适用于此。
好的,所以现在我们到了某个地方 - 我们有一些明确绑定的验证器只能查看是Contract
的孩子。我们的ContractValidator
不应该返回包含类似内容的结果吗?
public <T extends Contract> ContractValidator<T> validate(Validator<T> validator, Object object) {
return null;
}
现在这是我不同意设计的地方。他们想要的目的(出于某种原因)是拥有未绑定的泛型类型;大概是为了让你能够对任何东西进行验证。但我不知道该类型的用途是什么 - 它几乎可以是任何东西。
通过写作完成:
public <T extends Contract, F> ContractValidator<T> validate(Validator<T> validator, F object) {
return null;
}
现在,我已经编写了所有这些来有效地表明泛型 是可以理解的,前提是您展示的示例可以合理地编译并具有一定的语义感。在大多数情况下,如果你要使用泛型,你就是这样做的,因为你试图创建一些多态方法,或者你正在尝试创建一个多态容器。
关于泛型的Here's a great resource; Java Trails从未在这方面引导我。
答案 1 :(得分:2)
您使用这行代码的段落解释了使用泛型太多会使您的代码变得复杂。这一行的目的是表明理解的难度。
无论如何,它并不是一个很好的仿制药的例子,实际上我并不认为这是正确的。