public class B extends C <A> {
}
这是什么意思? C需要扩展A?我提出了什么额外的限制,而不仅仅是说B扩展C?
答案 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>
表示MyString
是ArrayList
只包含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)
班级B
是C
。
C
和B
参数化为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> {
}