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>
表示将只包含元素的MyString
IS AN 。然后这个类可以定义例如一个方法,它返回列表中所有的连接。ArrayList
String
concatenate()
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
,并确保您的所有Entity
s 都是可保存的。
然后你就有GenericDAO<Entity
了,还有一堆实现,例如UserDAO extends GenericDAO<User>
User 是一个实体。
这并不意味着任何事情,除非在或其上级中定义了一些方法来接受或返回 A 类参数。Class C
通过这样做,您可以通过施加限制说“他们可以接受或返回 A 类型的对象”来确保 类型安全。
public class B extends C <A> {
}