首页 > 解决方案 > 使用泛型:用泛型中的父值和子值实例化泛型类的对象

问题描述

考试中的问题是:编写一个名为 Registration 的类,它可以存储 T 类型的变量,其中 T 可以替换为 String、Person、Student 等。应该可以按如下方式实例化 Registration:

Registration<String> r1 = new Registration<String>();
Registration<Person> r2 = new Registration<Student>();

我无法弄清楚如何为类头的泛型部分编写声明。下面我给出了注册类。需要注意的是,Student 类继承了 Person 类。

import java.util.List;
import java.util.ArrayList;
public class Registration<T extends Person> //I believe my issue is here{
private T [] roster;
private List<T> waitList;
private static int rosterCount;
private T lastInstance;

public Registration () {
    roster =  (T[]) new Object[100];
    waitList = new ArrayList<>();
    rosterCount = 0;
    lastInstance = null;
}

public void addIndex (T t) {
    if (rosterCount>=100) {
        waitList.add(t);
    }
    else {
        roster [rosterCount] = t;
        rosterCount++;
    }
    lastInstance = t;
}

public T getLastInstance() {
    return lastInstance;
}

public int getRosterCount() {
    return rosterCount;
}

public int getWaitListCount() {
    return waitList.size();
}
}

**取自 Uoft CSC207 Aug2017 考试

标签: javagenericssubtyping

解决方案


如果Registration必须足够通用以接受任何类型,例如。String,那么您应该将其声明为:

class Registration<T> {
    private T[] roster;
    ...
    public Registration (Class<T> clazz) {
        roster = (T[])Array.newInstance(clazz, 100);
    }
    ...
} 

推荐阅读