Java中的语法<T extends Class<T>>

9

关于以下内容,我有几点想法:

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> 之间有什么区别 - 如果我需要在我的类中进行元素比较,两者都可以,是吗?

编辑:我认为问题3的问题可能在于它允许插入以第二种方式定义的列表具有不同的元素,这些元素都扩展自可比较的元素,然后当我想要比较它们时,由于我们无法比较字符串和整数,因此将无法实现,这两个都扩展自Comparable。


只是对风格的一点挑剔:你的公共类名不是驼峰式命名法,这种约定可以避免误解。虽然在嵌套类中这并不是什么问题,但在这种情况下它是一个公共类... - Tassos Bassoukos
为了获得最佳结果,请使用<T extends Comparable<? super T>> - newacct
3个回答

10
  1. 在声明maxStackclass<T extends Comparable <T>>中,您已经表达了对T的限制。因此,您不需要再次指定它。

  2. 原因同上。不需要再次指定相同类型参数的限制。

  3. <T extends Comparable<T>>意味着T必须实现可以比较两个T实例的Comparable接口。而<T extends Comparable>表示T实现了Comparable,可以比较一般的两个Objects。前者更为具体。

如果我需要比较我的类中的元素,这两个都可以,是吗?

嗯,从技术上讲,您可以使用两种方式来实现相同的结果。但对于声明<T extends Comparable>,它将涉及不必要的转换,您可以使用类型安全的<T extends Comparable<T>>来避免。


2

1)该类具有类型参数T和一个限定(extends Comparable <T>),此参数被传递给需要相同限定的接口。在传递类型参数时,不应重复其限定 - 为什么要这样做?

2)与1)类似,类型参数已经声明了其限定,不需要重复。

澄清一下:

第一个类型参数出现的位置(这里是接口或类名后面)是其声明。任何后续出现都是使用。您甚至永远不会每次使用变量时都编写其类型声明,对吧?


2

3- <T extends Comparable<T>><T extends Comparable>有什么区别- 如果我需要比较类中的元素,两者都可以,对吗?

不,两者都不行。假设我有一个类Foo,它实现了Comparable<Bar>,但是类Foo和类Bar之间没有关系。那么Foo无法与其他类型为Foo的对象进行比较。<T extends Comparable<T>>将捕获此问题,而<T extends Comparable>则不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接