之间有什么区别:
static void findMax(LinkedList<? extends Number> list){...}
Run Code Online (Sandbox Code Playgroud)
和:
static <T extends Number> void findMax(LinkedList<T> list){...}
Run Code Online (Sandbox Code Playgroud)
既然两者都有效,我想知道两者之间是否有任何重大差异,建议采用哪种方法.
ass*_*ias 14
主要区别在于,在第二个版本中,您可以访问该类型,T
而在第一个版本中您不能访问.
例如,您可能希望返回链接到T的内容(例如,返回T而不是void):
static <T extends Number> T findMax(LinkedList<T> list){...}
Run Code Online (Sandbox Code Playgroud)
或者您可能需要创建一个新的Ts列表:
static <T extends Number> void findMax(LinkedList<T> list){
List<T> copyAsArrayList = new ArrayList<> (list);
//do something with the copy
}
Run Code Online (Sandbox Code Playgroud)
如果您不需要访问权限T
,则两个版本在功能上都是等效的.
dar*_*jan 10
如果您只关心findMax
接受符合特定条件的列表(在您的情况下是扩展的类型列表),则应使用第一个Number
.
static Number findMax(LinkedList<? extends Number> list) {
Number max = list.get(0);
for (Number number : list) {
if (number > max) {
max = number;
}
}
return max;
}
Run Code Online (Sandbox Code Playgroud)
此方法返回Number
.例如,如果您有自己的类,Number
并且有一些特殊的方法,您希望稍后在此方法的结果上使用,则可能会出现问题.
当您计划T
在方法体中使用精确类型,方法参数或方法的返回类型时,应使用第二个.
static <T extends Number> T findMax(LinkedList<T> list, T currentMax) {
T max = currentMax;
for (T number : list) {
if (number > max) {
max = number;
}
}
return max;
}
Run Code Online (Sandbox Code Playgroud)
结论:
在功能上,它们几乎相同,只是具有未知类型(?
)的列表无法修改.
归档时间: |
|
查看次数: |
1263 次 |
最近记录: |