我正在辅导的学生正在参加一个Web开发课程,该课程使用了一本关于Java的Dietel书籍,其中包含了一些涉及泛型的奇怪代码:
class StackComposition <T>
{
private List<T> stackList;
public StackComposition()
{
stackList = new List<T>("stack") // ERROR
}
// .... more code
}
我很清楚为什么这段代码不起作用,我很困惑为什么教师建议学生使用这段代码作为起点。也许我只是不理解泛型,我的Java技能不足,但我不知道如何用泛型类型实例化泛型集合。我看到的目的是通过使用通用List集合并在运行时确定类型来创建Stack,但我不知道如何使用上面的配置。我的第一个倾向是告诉学生使用Generic Stack<T>
对象并忘记编写这个自定义Stack类,但显然这不是作业的目标。
我尝试使用java.lang.reflect
包来解决此问题,但据我所知,这只适用于非通用容器,例如Array
:
public StackComposition(Class<T> type)
{
Object obj = Array.newInstance(type, 10);
}
答案 0 :(得分:5)
您的代码中存在两个问题:
您尝试使用new
关键字实例化一个非法的接口。您应该实例化ArrayList
对象(或实现List
的类)。
其次,不允许您将String
引用传递给构造函数。
因此,您应该在代码中使用以下内容:
stackList = new ArrayList<T>();
或stackList = new ArrayList<T>(10);
如果您想为stackList
提供初始尺寸(请将您希望列表初始化的尺寸替换为10
)。
答案 1 :(得分: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
}
}