一个非泛型类继承泛型类意味着什么?

12
public class B extends C <A> {

}

这是什么意思?需要让 C 扩展 A 吗?我加入了什么额外的限制,而不只是说 B 扩展 C?

6个回答

18
在这种情况下,C是一个可以采用通用参数的类,您将具体类型A作为参数传递给它。然后,B扩展了C的特定参数化。
例如,假设:
class C<T> {
    T example();
}

class B extends C<Integer> {
}

那么B.example()将返回一个整数


1
当前示例并未解释使用B类相比直接使用C<Integer>的任何好处。只有在B中存在一些特定于Integer的行为时,它才真正有意义。 - herman

4
您正在定义一个从类C继承的类B,它使用类型A进行参数化。A必须是一个类或接口。
例如:
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

1
java.util.List 是一个接口,如果您想进行更正的话。 - Paul Bellora

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 对象作为参数。

谢谢。您能否详细解释一下“将A作为类型参数”的含义? - Victor
我已经更新了我的回答@Victor,所谓的“type”,是指您可以在通用类中使用该类型。 - Prasad Kharkar

1

B 是一个 C

CB 都是使用 A 作为参数化的。(这意味着它们可以有使用 A 方法或从 A 继承的类方法的方法等。)

这种情况的一个经典用例是你有一个 DAO(数据访问对象)。你创建了一个带有一些基本方法的通用 DAO,比如带有通用 save 方法的 GenericDAO。为了使其他 DAO 可以扩展 GenericDAO,你使用 Entity 参数化该类,并确保所有的 Entity 都是可保存的。

然后你就会得到 GenericDAO<Entity,和一堆实现它的类,例如 UserDAO extends GenericDAO<User>,其中 User 是一个实体。


0

简单来说

这并没有什么意义,除非在 C 类 或其 祖先类 中定义了一些方法,可以接受或返回 Type A 参数。

通过这样做,您可以通过强制限制"它们只能接受或返回 Type A 对象"来确保类型安全性


0
public class B extends C <A> {

}
  1. 如果A未定义,则对B没有限制(可以是任何对象类)。
  2. 如果A的类型已定义,则B必须是A的类型或子类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接