gpt4 book ai didi

java - 显式类型参数可以冗余吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:02 25 4
gpt4 key购买 nike

我有一个带有类型参数的类。

class MyObject<IdType> {

@Setter
@Getter
private IdType id;
}

我想我可以添加一些方便的方法,所以我就这么做了。

<T extends MyObject<? super IdType>> void copyIdTo(T object) {
object.setId(getId());
}

< T extends MyObject<? extends IdType>> void copyIdFrom(T object) {
object.copyIdTo(this);
}

我刚刚意识到我可以做到这一点。

void copyIdTo(MyObject<? super IdType> object) {
object.setId(getId());
}

void copyIdFrom(MyObject<? extends IdType> object) {
object.copyIdTo(this);
}

这两组方法是等价的吗?更喜欢哪种方式(或风格)?

最佳答案

在您的情况下,这两种方法实际上是等效的。它们都将参数的类型限制为 MyObject<...>或子类型。

由于您的示例方法返回 void使方法通用并没有真正的好处。您的方法唯一重要的是参数是 MyObject<...> ——除此之外,真实类型是没有意义的。添加使参数类型更具体的功能不会为方法的实现添加任何内容,也不会为调用者做任何事情。换句话说,它是无关紧要的“绒毛”。

因此,对于您的示例,我会说更喜欢非通用选项。它更简洁、更直接。


但是,如果您的方法将给定的参数返回给调用者,那么使该方法成为泛型可能会很有用;它将允许您将返回类型声明为 T .这为调用者打开了可能性,例如方法链接或在另一个方法调用“内部”调用方法,所有这些都基于作为参数传递的特定类型。核心库中的一个例子是 Objects.requireNonNull(T) .

@Thilo 在评论中提到了另一个使方法泛化的好例子:

Another case would be if your method takes multiple arguments. Then you can introduce a T to make sure those two arguments have the same type (instead of two distinct types that happen to [fulfill] the constraints individually).

关于java - 显式类型参数可以冗余吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56767205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com