public class B extends C <A> {
}
这是什么意思?那C需要扩展A吗?我有什么额外的限制,而不是仅仅说 B 扩展 C?
public class B extends C <A> {
}
这是什么意思?那C需要扩展A吗?我有什么额外的限制,而不是仅仅说 B 扩展 C?
在这种情况下,C是一个可以采用泛型参数的类,并且您将其指定为特定类型A作为参数。然后,B扩展C.
例如,假设:
class C<T> {
T example();
}
class B extends C<Integer> {
}
然后B.example()会返回一个Integer.
您正在定义从类 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
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对象作为参数
类B是一个C.
C并B用 参数化A。(这意味着他们可以拥有使用A方法的方法,或者从 A 继承的类的方法。)
一个典型的用例是你有一个 DAO(数据访问对象)。你用一些基本的方法来创建一个通用的 DAO,比如GenericDAO一个通用的save方法。为了使其他 DAO 可以扩展GenericDAO,您使用 参数化该类Entity,并确保您的所有Entitys 都是可保存的。
然后你就有GenericDAO<Entity了,还有一堆实现,例如UserDAO extends GenericDAO<User>User 是一个实体。
这并不意味着任何事情,除非在或其上级中定义了一些方法来接受或返回 A 类参数。Class C
通过这样做,您可以通过施加限制说“他们可以接受或返回 A 类型的对象”来确保 类型安全。
public class B extends C <A> {
}