Pra*_*ate 9 java generics list
我的答案
public static <T extends Comparable<? super T>>
T max(List<? extends T> list, int begin, int end) //Option1
public static <T extends Comparable<T>>
T max(List<? extends T> list, int begin, int end) //Option2
Run Code Online (Sandbox Code Playgroud)
从下面引用的答案
所以我的问题是
选项1:如果T extends Object & Comparable<? super T>替换为,会有什么不同吗T extends Comparable<? super T>?不extends Object隐含?
选项2:如果Comparable<? super T>替换为它会有什么不同Comparable<T>吗?如果是这样?
Eclipse代码完成List<? extends Comparable<? super Comparable<? super T>>> list;在Ctrl + 1上创建局部变量,max(list, 1, 10);这有点冗长.如何定义扩展的类(层次结构)Comparable<? super T>,创建列表并将实例添加到列表并调用下面的方法?基本上我想知道如何max()在将类实例添加A or B 到列表中后调用class B extends A
编写一个通用方法来查找列表[begin,end]范围内的最大元素.
回答:
import java.util.*;
public final class Algorithm {
public static <T extends Object & Comparable<? super T>>
T max(List<? extends T> list, int begin, int end) {
T maxElem = list.get(begin);
for (++begin; begin < end; ++begin)
if (maxElem.compareTo(list.get(begin)) < 0)
maxElem = list.get(begin);
return maxElem;
}
}
Run Code Online (Sandbox Code Playgroud)
如果
Comparable<? super T>更换它会有什么不同Comparable<T>吗?如果是这样?
请记住,可比较对象始终是消费者,即Comparable<T>消耗T实例,因此应始终优先使用(Comparable<? super T>而不是Comparable<T>(引用 - PECS)).如果您要比较超类实现的类型,它会有所不同Comparable<SuperType>.请考虑以下代码:
class Parent implements Comparable<Parent> {
protected String name;
@Override
public int compareTo(Parent o) {
return this.name.compareTo(o.name);
}
}
class Child extends Parent {
public Child(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你给你的类型参数T extends Comparable<T>,你将无法调用该方法List<Child>,因为Child没有实现,Comparable<Child>但是Comparable<Parent>:
public static <T extends Comparable<T>> T max(List<? extends T> list, int begin, int end) {
...
}
public static void main(String[] args) {
List<Child> list = new ArrayList<Child>();
max(list, 0, 2); // Error with current method. Child does not implement Comparable<Child>
}
Run Code Online (Sandbox Code Playgroud)
因此类型参数边界应该是T extends Comparable<? super T>.
请注意,您无法将Child类更改为:
class Child extends Parent implements Comparable<Child>
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下,Child类将从相同泛型类型的不同实例化扩展,这是不允许的.
如果
T extends Object & Comparable<? super T>被替换它会有什么不同吗T extends Comparable<? super T>?是不是extends Object隐含?
那么,这两个界限之间存在差异.在1 日的约束,类型参数的擦除是Object,而在2 次结合,擦除是Comparable.
因此,无限制Object地,您的代码将编译为:
public static Comparable max(List list, int begin, int end)
Run Code Online (Sandbox Code Playgroud)
当您正在泛化遗留的非通用代码时,可能会出现此问题.还必须给出Object上限以避免破坏字节码兼容性.你可以在这个链接上阅读更多相关信息:Angelika Langer - Programming Idioms
| 归档时间: |
|
| 查看次数: |
2167 次 |
| 最近记录: |