12
public class B extends C <A> {

}

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

4

6 回答 6

18

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

例如,假设:

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

class B extends C<Integer> {
}

然后B.example()会返回一个Integer.

于 2013-06-28T15:18:06.717 回答
4

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

例如

class MyStringList extends ArrayList<String>

表示将只包含元素的MyStringIS AN 。然后这个类可以定义例如一个方法,它返回列表中所有的连接。ArrayListStringconcatenate()Strings

由于这种继承,您将能够将实例分配给List<String>变量:

List<String> strings = new MyStringList();

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

List<Object> objects = new MyStringList(); // does not compile
于 2013-06-28T15:19:43.723 回答
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对象作为参数

于 2013-06-28T15:16:39.777 回答
1

B是一个C.

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

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

然后你就有GenericDAO<Entity了,还有一堆实现,例如UserDAO extends GenericDAO<User>User 是一个实体。

于 2013-06-28T15:17:19.353 回答
0

简单来说

这并不意味着任何事情,除非在或其上级中定义了一些方法接受返回 A 类参数。Class C

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

于 2013-06-28T16:21:26.543 回答
0
public class B extends C <A> {

}
  1. 如果 A 未定义,则对 B 没有限制(可以是任何对象类)。
  2. 如果定义了 A 的类型,则 B 必须是 A 类型或 A 的子类。
于 2016-12-06T02:25:29.943 回答