【发布时间】:2013-06-28 15:15:02
【问题描述】:
public class B extends C <A> {
}
这是什么意思?那C需要扩展A吗?除了说 B 扩展 C 之外,我还有什么额外的限制?
【问题讨论】:
标签: java generics inheritance
public class B extends C <A> {
}
这是什么意思?那C需要扩展A吗?除了说 B 扩展 C 之外,我还有什么额外的限制?
【问题讨论】:
标签: java generics inheritance
在这种情况下,C 是一个可以接受泛型参数的类,并且您将给它一个特定类型 A 作为参数。然后,B 扩展了 C 的特定参数化。
例如,假设:
class C<T> {
T example();
}
class B extends C<Integer> {
}
那么B.example() 将返回Integer。
【讨论】:
class B 比直接使用C<Integer> 有什么好处。只有在B 中有一些Integer 特有的行为才真正有意义。
您正在定义一个从类 C 继承的类 B,并使用类型 A 进行参数化。A 必须是类或接口。
例如
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
【讨论】:
java.util.List 是一个接口,以防您想更正它。
B 类是 C。
C 和 B 使用 A 参数化。 (这意味着他们可以拥有使用 A 方法的方法等,或者从 A 继承的类的方法。)
一个典型的用例是你有一个 DAO(数据访问对象)。您使用一些基本方法创建一个通用 DAO,例如使用通用 save 方法的 GenericDAO。为了使其他 DAO 可以扩展 GenericDAO,您可以使用 Entity 参数化该类,并确保您的所有 Entitys 都是可保存的。
然后你有GenericDAO<Entity,以及它的一堆实现,例如UserDAO extends GenericDAO<User>,其中用户是一个实体。
【讨论】:
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 对象作为参数
【讨论】:
这并不意味着什么,除非在Class C 或其ascendants 中定义了一些方法,可以接受 或返回 Type A 参数。
通过这样做,您可以通过施加限制说“他们可以接受或返回类型 A 的对象”来确保 类型安全。
【讨论】:
public class B extends C <A> {
}
【讨论】: