Lab 8: 泛型(Generics)

本次 Lab 时长为 2 周,DDL 为 11 月 13 日 23:59

附件下载(包括问答题和实验报告模板):https://bhpan.buaa.edu.cn/link/AA96D0CA694BB74ABFA070F38B6C527AC6

实验目的

  • 理解集合框架的设计思路

  • 了解 Java 常用的数据结构类及其使用,迭代器(Iterator) 、线性表(ListArrayListLinkedList)、HashMap 类、HashSet 类及枚举类在企业级软件编写中经常用到,要求在理解的基础上,熟练掌握

  • 理解泛型的概念、必要性并能够灵活使用

实验题目

Question 1 简答题

简述 ArrayListLinkedList 的区别。

Question 2 简答题

阅读下面的程序,写出它的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Animal.java
public class Animal {
public Animal() {
System.out.println("I am an animal");
}
}

// Dog.java
public class Dog extends Animal {
public Dog() {
System.out.println("I am a dog");
}
}

// AnimalTest.java
public class AnimalTest {
public <T, S extends T> T testDemo(T t, S s) {
System.out.println("I am type T and my type is " + t.getClass().getName());
System.out.println("I am type S and my type is " + s.getClass().getName());
return t;
}

public static void main(String[] args) {
AnimalTest test = new AnimalTest();
Dog dog = new Dog();
Animal animal = new Animal();
Animal animal1 = test.testDemo(animal, dog);
}
}

Question 3 简答题

阅读下面的程序,写出它的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Animal.java
public class Animal {
public Animal() {
System.out.println("I am an animal");
}
}

// Dog.java
public class Dog extends Animal {
public Dog() {
System.out.println("I am a dog");
}
}

// AnimalTest1.java
import java.util.List;
import java.util.ArrayList;

public class AnimalTest1 {
public void testDemo(List<?> s) {
for (Object obj : s) {
System.out.println("My type is " + obj.getClass().getName());
}
}

public static void main(String[] args) {
AnimalTest1 test = new AnimalTest1();
Dog dog = new Dog();
Animal animal = new Animal();
List<Animal> s = new ArrayList<Animal>();
s.add(dog);
s.add(animal);
test.testDemo(s);
}
}

Question 4:编程题

请用 LinkedList 实现一个支持泛型的栈 MyStack,并在 main 函数中测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// MyStack.java

import java.util.LinkedList;

public class MyStack<T> {
private LinkedList<T> values = new LinkedList<T>();

public void push(T t) {
// Your code here
}

public T pop() {
// Your code here
}

public T top() {
// Your code here
}

public static void main(String[] args) {
/* Your test code here */
}
}

关于泛型

想要完全掌握泛型,Lab 里提供的示例是远远不够的,大家需要自行寻找一些资料进行学习。

题外话,泛型不一定只能叫做 ETV 等,和普通标识符一样,它可以是任何名字,比如 TElementTValue。😉