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

时间:2019-06-26 07:14:30

标签: java generics bounded-wildcard

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

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);
}

这两套方法是否等效?首选哪种方式(或样式)?

2 个答案:

答案 0 :(得分:5)

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

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

因此,对于您的示例,我想说说非通用选项。它更干净,更直接。


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

@Thilo在评论中提到了使方法通用的另一个好案例:

  

另一种情况是您的方法采用多个参数。然后,您可以引入T以确保这两个参数具有相同的类型(而不是碰巧分别[满足]约束的两个不同类型)。

例如,如果是Collection<? extends T>,也可以将其应用于单个参数。

答案 1 :(得分:2)

是的,它们是等效的。两组方法都声明同一件事-方法参数必须为#!/usr/bin/env python3 import subprocess first = True with open('VideoSlicepoints_Python.txt') as f: for line in f.readlines(): if first: first = False else: filename, VideoDing_Timecode, Video_R4Start, Video_R4End, Video_R24Start, Video_R24End, Video_R0plus15 = line.strip().split(';') cmd = ['ffmpeg', '-i', filename, '-ss', Video_R4Start, '-to', Video_R4End, '-c', 'copy', 'S:/_RobotThesis/VideoRounds/' + filename[:-4] + '_r4' + filename[-4:]] print(" ".join(cmd)) subprocess.run(cmd, stderr=subprocess.STDOUT) 类型或兼容的子类型(子类)。

以这种方式声明MyObject<>的唯一原因是,如果您需要在其他地方引用T,例如方法的返回类型,或者如果您有多个相同类型的参数,或在方法主体内部。

我总是更喜欢较短,更简单,更清晰的版本,且带有较少的尖括号以伤害眼球:)