【发布时间】:2020-06-18 00:10:20
【问题描述】:
我是 Generic in Java 的初学者,我正在学习关于这个概念的课程。本课程的讲师这样解释这些代码:
代码:
public class Instructor extends User { // --- }
--
public class Utils {
public static void printUsers(GenericList<User> users){
// ---
}
}
--
public class Test {
public static void main(String[] args) {
var users = new GenericList<Instructor>();
Utils.printUsers(instructors);
}
}
他的解释:
在 main 方法中,我们得到编译错误,因为 GenericList
Instructor不是User的 GenericList 的子类型。我的意思是GenericList<Instructor>不会扩展和继承GenericList<User>。这是为什么呢?我们查看了这个 GenericList 的字节码表示 班级。正如我之前向您展示的那样,这个 GenericList 在内部维护了一个 无论我们作为类型参数传递什么,
Object的列表。无论我们通过
UserClass 还是InstructorClass,我们只有一个 在我们的项目中单个GenericList,并且此类不是 本身。这就是为什么Instructor的 GenericList 不是User的 GenericList 的子类型。因为我们正在处理一个单一的 类。
现在; 我完全糊涂了。非常非常困惑!
为什么他说我们只有一个班级?
GenericList<Instructor>和GenericList<User>是两个类,尽管它们具有相同的字节码。 (因为他们都维护对象列表,编译器会将每个T替换为Object)如果我们的项目中只有一个 GenericList 并且这个类不是它自己的子类型,那么
GenericList<Instructor>的实例和GenericList<User>的实例没有区别,它们都属于同一个类。
为什么我会得到这样的结果?因为根据老师的说法,我们只有一个类,那么为什么printUsers 方法不接受 GenericList 的实例作为参数?
最后,我对这一段一无所知:
无论我们通过
UserClass 还是InstructorClass,我们只有一个 在我们的项目中单个GenericList并且此类不是 本身。这就是为什么Instructor的 GenericList 不是User的 GenericList 的子类型。因为我们正在处理一个单一的 类。
谁能帮我理解这些解释?谢谢。
【问题讨论】:
-
GenericList<T>类型在T类型中是泛型的,而不是在一组类型中。例如,如果您定义了GenericList<? extends T>,那么该代码将起作用。 -
检查this。
-
泛型类是同一个类;你没有两个班级。您有两个对泛型类的引用及其相关的编译时类型信息。而且,正如您所指出的,该类型信息在运行时不存在(类型擦除)。 docs.oracle.com/javase/tutorial/java/generics/erasure.html
-
@DaveNewton 在此链接中,他假设为两个类别:dzone.com/articles/how-do-generic-subtypes-work。他错了吗?
-
@MehSar 我会说他不精确,而且编译时间和运行时间是有区别的。它是具有不同类型(在编译时)的同一个类(这是泛型的重点)。
标签: java generics inheritance