【发布时间】:2016-03-01 04:04:05
【问题描述】:
我正在尝试设计自己的编程语言,并且正在考虑泛型。我做 Java 已经有一段时间了,知道 extends 和 super 泛型边界。
我正在阅读this 的帖子并试图了解对下限的需求。
在我的语言中,我打算像普通字段一样使用泛型,如果你说List<MyObject>,你可以存储MyObject,或MyObject 的任何子类型。有道理吗?
在帖子中,它们具有以下类层次结构:
class Person implements Comparable<Person> {
...
}
class Student extends Person {
...
}
然后他们有一个排序方法:
public static <T extends Comparable<T>> void sort(List<T> list) {
...
}
我认为,您应该能够向此方法发送List<Student>。作为Student 扩展Person,compare 方法将由它的超类Person 处理。
错误消息的原因是编译器将排序方法的类型参数推断为 T:=Student 并且 Student 类不是
Comparable<Student>。是Comparable<Person>,但是不符合方法排序的类型参数的界限的要求。要求T(即Student)是Comparable<T>(即Comparable<Student>),其实不是。
以上对我来说没有任何意义......你应该可以做到student.compare(person),那么为什么这不起作用?
也许是说Student 应该实现它自己的可比较方法,以便Student 在比较中有发言权?你不需要做任何特别的事情,只需覆盖Person 的方法。您无法保证您正在与另一个 Student 进行比较,但可以通过 instanceof 进行检查。
这里有什么我遗漏的吗?
经过这么多思考,我现在想知道extends 的目的是什么。据我了解,在List<MyType> 中,您只能放入MyType,而不是它的任何子类。如上所述,这对我来说没有任何意义,您应该能够将任何子类像字段一样放在列表中。
我可能应该说清楚,这不是“为什么它在 Java 中不起作用”,而是“为什么它在泛型理论中不起作用”。我只是标记了 java,因为这是我进行比较的地方。
【问题讨论】:
-
in a List<MyType>, you can only put a MyType in, not any of it's subclasses不正确。 -
那么
extends的目的是什么? -
如果您需要深入了解 Java 泛型,那么您的第一站应该是这个常见问题解答,angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
-
“作为 Student 扩展 Person,比较方法将由它的超类 Person 处理。” 如果您推断
T=Person,那么您正在尝试转换 @987654353 @ 到List<Person>这是不允许的。 “为什么我不能用 Java 泛型做 X?” 形式的几乎所有问题的答案是 X 可能导致某种失败。
标签: java language-design