我对以下内容有几点想法:
public interface MaxStack<T extends Comparable <T>>
1 - 为什么实现MaxStack
的类应该这样写:
public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T>
而不是public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T extends Comparable <T>>
?
2-为什么当我使用泛型时,这个类的私有变量只能用<T>
编写,而不能用<T extnds Comparable<T>>
编写?例如,private List<T> stack= new ArrayList<T>();
3 - <T extends Comparable<T>>
和<T extends Comparable>
之间的区别是什么 - 如果我需要比较班级中的四个元素,那么两者都是O.K,不是吗?
编辑:我认为3的问题在于它可能允许插入以第二种方式定义的列表,以便具有不同的元素,这些元素都可以从可比较的方面扩展,然后当我想比较它们时,它赢了“因为我们无法将String与Integer进行比较,所以都可以从Comparable扩展。
答案 0 :(得分:9)
在声明maxStackclass<T extends Comparable <T>>
中,您已经表达了T
的界限。所以你不需要它了。
与上述相同的原因。无需再次在同一类型参数上指定边界。
<T extends Comparable<T>>
表示T
必须实现可以比较两个Comparable
实例的T
接口。虽然<T extends Comparable>
表示T
实现了Comparable
,但它通常可以比较两个Object
。前者更具体。
如果我需要比较班上的各种元素,两者都是O.K, 没有?
嗯,从技术上讲,可以使用两者来实现相同的结果。但是对于声明<T extends Comparable>
,它将涉及不必要的强制转换,您可以避免使用类型safe <T extends Comparable<T>>
答案 1 :(得分:2)
1)该类有一个带有绑定(T
)的类型参数extends Comparable <T>
,该参数被传递给接口(这里需要相同的绑定)。传递类型参数时,您不能重复它的约束 - 为什么要这样做?
2)如1),type参数声明了它的绑定,没有重复必要。
澄清:
第一个类型参数出现(在接口或类名后面)是它的声明。任何以下出现都是一种用法。你每次使用它时都不会写一个变量类型声明,对吗?
答案 2 :(得分:2)
“3 - <T extends Comparable<T>>
和<T extends Comparable>
之间有什么区别 - 如果我需要比较班级中的四个元素,那么两者都是O.K,不是吗?”
不,两者都不会好的。假设我有一个Foo
类implements Comparable<Bar>
,但是类Foo和Bar彼此没有关系。然后Foo
无法与Foo
类型的其他对象进行比较。 <T extends Comparable<T>>
会将此视为问题。 <T extends Comparable>
不会。
答案 3 :(得分:-1)
<T extends Comparable<? super T>>
更多详情here