0

我正在辅导的一个学生正在学习一个使用 Dietel 关于 Java 的书的 Web 开发课程,其中包含一些涉及泛型的奇怪代码:

class StackComposition <T>
{
    private List<T> stackList;

    public StackComposition()
    {
        stackList = new List<T>("stack")  // ERROR
    }

    // .... more code
}

我很清楚为什么这段代码不起作用,我对为什么教师建议学生使用这段代码作为起点感到困惑。也许我只是不了解泛型并且我的 Java 技能不足,但我不明白如何用泛型类型实例化泛型集合。我看到意图是通过使用通用列表集合并在运行时确定类型来创建堆栈,但我看不出使用上述配置如何实现这一点。我的第一个倾向是告诉学生使用 GenericStack<T>对象而忘记编写这个自定义 Stack 类,但显然这不是作业的目标。

我尝试使用该java.lang.reflect软件包进行测试来解决此问题,但据我所知,这仅适用于非通用容器,例如Array

public StackComposition(Class<T> type)
{
    Object obj = Array.newInstance(type, 10);
}
4

2 回答 2

5

您的代码中有两个问题:

您正在尝试使用new非法的关键字实例化接口。您应该实例化ArrayList(或实现的类List)的对象。

其次,不允许将String引用传递给构造函数。

因此,这是您应该在代码中使用的内容:

stackList = new ArrayList<T>();

或者stackList = new ArrayList<T>(10);如果你想给你的初始大小stackList(替换10为你希望你的列表被初始化的大小)。

于 2013-02-27T22:09:08.680 回答
0

从纯粹的教学角度来看,该练习可能旨在通过将某些方法转发到某些更通用类型的包含实例来说明组合。只需要暴露想要的方法,内部使用的具体类型可以根据需要改变。

import java.util.Deque;
import java.util.LinkedList;

public class MyStack<T> {

    private Deque<T> deque = new LinkedList<T>();

    public void push(T item){
        deque.push(item);
    }

    public T pop() {
        return deque.pop();
    }

    public static void main(String[] args) {
        MyStack<Integer> stack = new MyStack<>();
        stack.push(42); // OK
        stack.addFirst(0); // no such method
    }
}
于 2013-02-28T03:32:13.237 回答