非泛型类扩展泛型类意味着什么

时间:2013-06-28 15:15:03

标签: java generics inheritance

public class B extends C <A> {

}

这是什么意思? C需要扩展A?我提出了什么额外的限制,而不仅仅是说B扩展C?

6 个答案:

答案 0 :(得分:18)

在这种情况下,C是一个可以采用泛型参数的类,并且您将为其指定特定类型A作为参数。然后,B扩展了C

的特定参数化

例如,假设:

class C<T> {
    T example();
}

class B extends C<Integer> {
}

然后B.example()将返回Integer

答案 1 :(得分:4)

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

E.g。

class MyStringList extends ArrayList<String>

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

由于这种继承,您可以将实例分配给List<String> strings = new MyStringList(); 变量:

List

但您无法使用其他参数将其分配给List<Object> objects = new MyStringList(); // does not compile 类型变量:

{{1}}

答案 2 :(得分:1)

C<A>并不意味着C正在扩展A,这意味着它可以A作为类型参数。

这与java中的Comparable<T>Comparator<T>接口非常相似。

考虑以下示例

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个对象作为参数

答案 3 :(得分:1)

班级BC

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

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

然后你有GenericDAO<Entity,以及其中的一堆实现,例如UserDAO extends GenericDAO<User>,其中User是一个实体。

答案 4 :(得分:0)

简单来说就是

这并不意味着什么,除非在Class C或其后代中定义了方法,否则接受返回A类参数。

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

答案 5 :(得分:0)

public class B extends C <A> {

}
  1. 如果A未定义,则对B没有限制(可以是任何Object类)。
  2. 如果定义了A的类型,则B必须是A类或A的子类。