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()
将返回一个整数
。
class MyStringList extends ArrayList<String>
MyString
是一个只包含String
元素的ArrayList
。这个类可以定义一个concatenate()
方法,返回列表中所有String
的连接字符串。List<String>
变量。List<String> strings = new MyStringList();
但您将无法将其分配给其他参数的List
类型变量:
List<Object> objects = new MyStringList(); // does not compile
java.util.List
是一个接口,如果您想进行更正的话。 - Paul BelloraC<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,比如带有通用 save
方法的 GenericDAO
。为了使其他 DAO 可以扩展 GenericDAO
,你使用 Entity
参数化该类,并确保所有的 Entity
都是可保存的。
然后你就会得到 GenericDAO<Entity
,和一堆实现它的类,例如 UserDAO extends GenericDAO<User>
,其中 User 是一个实体。
这并没有什么意义,除非在 C 类
或其 祖先类 中定义了一些方法,可以接受或返回 Type A 参数。
通过这样做,您可以通过强制限制"它们只能接受或返回 Type A 对象"来确保类型安全性。
public class B extends C <A> {
}
B类
相比直接使用C<Integer>
的任何好处。只有在B
中存在一些特定于Integer
的行为时,它才真正有意义。 - herman