今天早些时候,我参加了名为“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
对象输入到仅容纳 Student
的 ArrayList
对象...
方法调用的工作方式完全相同。只需从方法签名中剥离参数类型并尝试想象对该类型的赋值...
关于java - 今天早些时候在考试中遇到问题 - ArrayList 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9673279/