java - 今天早些时候在考试中遇到问题 - ArrayList 方法

标签 java android list collections arraylist

今天早些时候,我参加了名为“Java for Android I”的类(class)考试,发现这个问题我就是不明白。也许你们中的一些人可以为我解释一下。

问题:

View this collection ArrayList p. A class Person is a superclass to Student. ArrayList implements the List-interface (according to the Java-API).

The compiler wont allow some of the situations noted in the code. Why? Describe how they may entail that p wont contain instances of Person or why p is not a ArrayList . E.g. p.add("Hello"); now contains a String instance.

代码:

p = new ArrayList<Object>();

void method ( ArrayList<Student> als) { ... }

void method ( List<Person> lp ) { ... }

void method ( ArrayList<Object> alo) { ... }

您如何描述这个问题?我只是不明白我的教授想让我回答什么。

抱歉,如果引用搞乱了语法。我一直在从瑞典语翻译它。

最佳答案

您教授的问题是关于 Java 泛型中类型检查的基础知识。假设:

class Person {
}

class Student extends Person {
}

这是一个有效的 fragment :

List<Person> list = new ArrayList<Person>();

是这样的:

List<Object> list = new ArrayList<Object>();

这显然是无效的,因为对象可以是 Person 实例而不是 Student 实例:

List<Student> list = new ArrayList<Person>();

但是这个是我最喜欢的——它总是让人绊倒:

List<Person> list = new ArrayList<Student>();

这是一个无效的 fragment 。 “什么为什么!”我听到你问。好吧,确实所有 Student 对象也是 Person 的实例,因此像这样的赋值工作:

Person person = new Student();

不过,当谈到参数类型时,Java 编译器会尽力保护您。想象一下这段代码:

List<Person> list = new ArrayList<Student>();

list.add(new Person());

如果编译器不反对分配,现在可以将 Person 对象输入到仅容纳 StudentArrayList对象...

方法调用的工作方式完全相同。只需从方法签名中剥离参数类型并尝试想象对该类型的赋值...

关于java - 今天早些时候在考试中遇到问题 - ArrayList 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9673279/

相关文章:

python - 查找最长的连续子数组(未排序)-Python

java - Solr 8.1启动错误-maxBooleanClauses

用于视频过滤器的 Android FFMPEG 命令行

Android:SimpleDateFormat 不断增加我的时间 1 小时

android - 三星 Galaxy S4 未对齐操作栏图标

c# - 将 List<object> 添加到 EF

java - System.out.println 不适用于数字

java - JPanel 重绘未清除

java - 小程序使用post方式通信

r - 更新R中嵌套循环中的列表