【问题标题】:The syntax <T extends Class<T>> in JavaJava 中的语法 <T extends Class<T>>
【发布时间】:2011-11-09 02:34:21
【问题描述】:

我有以下几点想法:

public interface MaxStack<T extends Comparable <T>>

1-为什么实现MaxStack的类要这样写:

public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T>

而不是public class MaxStackclass&lt;T extends Comparable &lt;T&gt;&gt; implements MaxStack&lt;T extends Comparable &lt;T&gt;&gt;?

2- 为什么这个类的私有变量,当我使用泛型时,应该只写&lt;T&gt;而不写&lt;T extnds Comparable&lt;T&gt;&gt;?例如private List&lt;T&gt; stack= new ArrayList&lt;T&gt;();

3-&lt;T extends Comparable&lt;T&gt;&gt; 和 &lt;T extends Comparable&gt; 有什么区别-如果我需要比较班级中的以下元素,两者都可以,不是吗?

编辑:我认为 3 的问题在于,它可能允许插入以第二种方式定义的列表以具有所有从可比较扩展的不同元素,然后当我想比较它们时,它不会不可能,因为我们无法将 String 与 Integer 进行比较,两者都从 Comparable 扩展而来。

【问题讨论】:

  • 只是对风格的挑剔:您的公共类的名称不是 CamelCase,这是一种避免误解的约定。虽然嵌套类不是这样的问题,但在这种情况下它是一个公共类......
  • 为了获得最佳效果,请使用&lt;T extends Comparable&lt;? super T&gt;&gt;

标签: java generics syntax


【解决方案1】:

“3-&lt;T extends Comparable&lt;T&gt;&gt; 和 &lt;T extends Comparable&gt; 有什么区别-如果我需要比较班级中的以下元素,两者都可以,不是吗?”

不,两者都不会好。假设我有一个 Foo 类 implements Comparable&lt;Bar&gt; 但类 Foo 和 Bar 彼此没有关系。那么Foo 无法与Foo 类型的其他对象进行比较。 &lt;T extends Comparable&lt;T&gt;&gt; 会将此视为问题。 &lt;T extends Comparable&gt; 不会。

【讨论】:

    【解决方案2】:

    1) 类有一个类型参数T 有一个边界(extends Comparable &lt;T&gt;),这个参数被传递给接口(这里需要相同的边界)。传递类型参数时,不能重复其界限——为什么要这样做?

    2) 与 1) 一样,类型参数已声明其边界,无需重复。

    澄清一下:

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

    【讨论】:

      【解决方案3】:
      1. 在声明maxStackclass&lt;T extends Comparable &lt;T&gt;&gt; 中,您已经表达了T 的界限。所以你不再需要它了。

      2. 原因同上。无需再次对同一类型参数指定边界。

      3. &lt;T extends Comparable&lt;T&gt;&gt; 表示T 必须实现可以比较两个T 实例的Comparable 接口。而&lt;T extends Comparable&gt; 表示T 实现Comparable,因此它通常可以比较两个Objects。前者更具体。

      如果我需要比较班级中的几个元素,两者都可以, 没有?

      好吧,从技术上讲,您可以同时使用两者来获得相同的结果。但是对于声明&lt;T extends Comparable&gt;,它将涉及不必要的强制转换,您可以避免使用安全类型&lt;T extends Comparable&lt;T&gt;&gt;

      【讨论】:

        猜你喜欢
        • 2015-06-14
        • 2012-01-22
        • 2019-01-26
        • 2017-05-21
        • 1970-01-01
        • 2020-03-12
        • 2023-03-15
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多