Java 实例化列表<;T>;可以使用泛型类型吗?

Java 实例化列表<;T>;可以使用泛型类型吗?,java,generics,objectinstantiation,Java,Generics,Objectinstantiation,我正在辅导的一名学生正在学习一门web开发课程,该课程使用了Dietel关于Java的一本书,其中包含了一些涉及泛型的奇怪代码: class StackComposition <T> { private List<T> stackList; public StackComposition() { stackList = new List<T>("stack") // ERROR } // ....

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

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

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

    // .... more code
}

代码中有两个问题:

stackList = new ArrayList<T>();
您试图用
new
关键字实例化一个接口,这是非法的。您应该实例化
ArrayList
的对象(或者实现
List
的类)

其次,不允许将
字符串
引用传递给构造函数

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

stackList = new ArrayList<T>();
stackList=newarraylist();

stackList=newarraylist(10)
如果您想为您的
堆栈列表提供一个初始大小(将
10
替换为您想要初始化列表的大小)。

您的代码中有两个问题:

stackList = new ArrayList<T>();
您试图用
new
关键字实例化一个接口,这是非法的。您应该实例化
ArrayList
的对象(或者实现
List
的类)

其次,不允许将
字符串
引用传递给构造函数

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

stackList = new ArrayList<T>();
stackList=newarraylist();

stackList=newarraylist(10)
如果你想给你的
stackList
一个初始大小(将
10
替换为你想要初始化列表的大小)。

从纯教学的角度来看,这个练习可能是为了通过将某些方法转发到某个更一般类型的包含实例来说明组合。只有所需的方法需要公开,内部使用的混凝土类型可以根据需要进行更改

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
    }
}
import java.util.Deque;
导入java.util.LinkedList;
公共类MyStack{
private Deque Deque=new LinkedList();
公共无效推送(T项){
推压(项目);
}
公共广播电台{
返回deque.pop();
}
公共静态void main(字符串[]args){
MyStack stack=新MyStack();
stack.push(42);//好的
stack.addFirst(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
    }
}
import java.util.Deque;
导入java.util.LinkedList;
公共类MyStack{
private Deque Deque=new LinkedList();
公共无效推送(T项){
推压(项目);
}
公共广播电台{
返回deque.pop();
}
公共静态void main(字符串[]args){
MyStack stack=新MyStack();
stack.push(42);//好的
stack.addFirst(0);//没有这样的方法
}
}

stackList=new ArrayList()
怎么样?
stackList=new List(“stack”)
如果您指的是
java.util.List
,那么很明显为什么这一行不会编译。因为,列表是一个接口,你们不能实例化它。第二,再次看到你们的声明。我认为
List
是一种自定义类型,因为
任何实现子类型的列表都没有将
字符串作为argument@PremGenError假设你是对的,那么问题出在
some.wird.package.List
类的实现中,而不是出现在给出的代码中。你们都是对的。我确实包含了
java.util.List
,并试图实例化一个抽象类
List
。(我总是忘记C#和Java实际上是不同的语言)。这可能只是作者的一个错误,或者他们定义了自己的自定义列表类(最有可能的情况)。如果您指的是
java.util.List
,那么
stackList=new ArrayList()
stackList=new List(“stack”)
,很明显,这行代码无法编译。因为,列表是一个接口,你们不能实例化它。第二,再次看到你们的声明。我认为
List
是一种自定义类型,因为
任何实现子类型的列表都没有将
字符串作为argument@PremGenError假设你是对的,那么问题出在
some.wird.package.List
类的实现中,而不是出现在给出的代码中。你们都是对的。我确实包含了
java.util.List
,并试图实例化一个抽象类
List
。(我总是忘记C#和Java实际上是不同的语言)。这可能只是作者的一个错误,或者他们定义了自己的自定义列表类(最有可能的情况)。谢谢。我在书的前面发现,作者确实在使用他们自己的
List
类。但是在上面的示例代码中,他们使用了自己的包。这应该是我骗你的线索。我在书的前面发现,作者确实在使用他们自己的
List
类。但是在上面的示例代码中,他们使用了自己的包。这应该是我的线索