我有一个带有类型参数的类。
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);
}
这两套方法是否等效?首选哪种方式(或样式)?
答案 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
,例如方法的返回类型,或者如果您有多个相同类型的参数,或在方法主体内部。
我总是更喜欢较短,更简单,更清晰的版本,且带有较少的尖括号以伤害眼球:)