通用Java代码难以理解?

时间:2014-12-18 08:39:56

标签: java generics

我找到了代表Java泛型功能的Java code line,但我无法阅读和理解它。如何理解以下Java代码行?

public <T, F> ContractValidator<T extends Contract> T validate(Validator<T>, F object)

2 个答案:

答案 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;未使用ValidatorContract键入的任何____ 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)

您使用这行代码的段落解释了使用泛型太多会使您的代码变得复杂。这一行的目的是表明理解的难度。

无论如何,它并不是一个很好的仿制药的例子,实际上我并不认为这是正确的。