【问题标题】:What does it mean for a non generic class to extend a generic class非泛型类扩展泛型类是什么意思
【发布时间】:2013-06-28 15:15:02
【问题描述】:
public class B extends C <A> {

}

这是什么意思?那C需要扩展A吗?除了说 B 扩展 C 之外,我还有什么额外的限制?

【问题讨论】:

    标签: java generics inheritance


    【解决方案1】:

    在这种情况下,C 是一个可以接受泛型参数的类,并且您将给它一个特定类型 A 作为参数。然后,B 扩展了 C 的特定参数化。

    例如,假设:

    class C<T> {
        T example();
    }
    
    class B extends C<Integer> {
    }
    

    那么B.example() 将返回Integer

    【讨论】:

    • 当前示例没有说明使用class B 比直接使用C&lt;Integer&gt; 有什么好处。只有在B 中有一些Integer 特有的行为才真正有意义。
    【解决方案2】:

    您正在定义一个从类 C 继承的类 B,并使用类型 A 进行参数化。A 必须是类或接口。

    例如

    class MyStringList extends ArrayList<String>
    

    表示MyString 是一个ArrayList,它只包含String 元素。然后这个类可以定义例如一个concatenate() 方法,返回列表中所有Strings 的串联。

    由于这种继承,您将能够将实例分配给List&lt;String&gt; 变量:

    List<String> strings = new MyStringList();
    

    但是你将无法将它分配给带有其他参数的List 类型变量:

    List<Object> objects = new MyStringList(); // does not compile
    

    【讨论】:

    • java.util.List 是一个接口,以防您想更正它。
    【解决方案3】:

    B 类是 C

    CB 使用 A 参数化。 (这意味着他们可以拥有使用 A 方法的方法等,或者从 A 继承的类的方法。)

    一个典型的用例是你有一个 DAO(数据访问对象)。您使用一些基本方法创建一个通用 DAO,例如使用通用 save 方法的 GenericDAO。为了使其他 DAO 可以扩展 GenericDAO,您可以使用 Entity 参数化该类,并确保您的所有 Entitys 都是可保存的。

    然后你有GenericDAO&lt;Entity,以及它的一堆实现,例如UserDAO extends GenericDAO&lt;User&gt;,其中用户是一个实体。

    【讨论】:

      【解决方案4】:

      C&lt;A&gt; 并不意味着C 是对A 的扩展,而是可以将A 作为类型参数。

      这与java中的Comparable&lt;T&gt;Comparator&lt;T&gt;接口非常相似。

      考虑下面的例子

      public class NameSort implements Comparator<Employee> {
         public int compare(Employee one, Employee another){
             return (int)(one.getName() - another.getName());
         }
      }
      

      表示 Comparator 正在使用 Employee 对象来使用其名称对它们进行排序。

      你也可以举个例子

         List<String> list = new ArrayList<String>();
      

      这行表示List 使用String 对象作为参数

      【讨论】:

      • 谢谢。您能否详细说明“将 A 作为类型参数”是什么意思?
      • 我已经更新了我的答案@Victor,按类型,我的意思是您可以在泛型类中使用该类型。
      【解决方案5】:

      简单来说

      这并不意味着什么,除非在Class C 或其ascendants 中定义了一些方法,可以接受 或返回 Type A 参数。

      通过这样做,您可以通过施加限制说“他们可以接受或返回类型 A 的对象”来确保 类型安全

      【讨论】:

        【解决方案6】:
        public class B extends C <A> {
        
        }
        
        1. 如果 A 未定义,则对 B 没有限制(可以是任何对象类)。
        2. 如果定义了 A 的类型,则 B 必须是 A 类型或 A 的子类。

        【讨论】:

          猜你喜欢
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-25
          • 2020-09-10
          • 1970-01-01
          • 2019-05-24
          • 1970-01-01
          相关资源
          最近更新 更多