为什么这些变量在这种通用方法中具有不同的类型?

时间:2019-06-23 22:00:33

标签: java generics queue

为什么只用“ T”创建“结果”,而用“ {Queue<T>”创建“ temp”,这有关系吗?

// returns the item at the front of the given queue,
  without 
     // removing it from the queue
     public static <T> T peek(Queue<T> q) 
     throws NoSuchElementException {
        /** COMPLETE THIS METHOD **/
        if (q.isEmpty()) {
            throw new NoSuchElementException("Queue Empty");
        }
        T result = q.dequeue();

        Queue<T> temp = new Queue<T>();
        temp.enqueue(result);

        while(!q.isEmpty()) {
           temp.enqueue(q.dequeue());
        }

        while(!temp.isEmpty()) {
           q.enqueue(temp.dequeue());
        }
        return result;
     }

1 个答案:

答案 0 :(得分:2)

resulttemp的类型不同,因为它们表示不同类型的事物。让我们看一下这段代码:

T result = q.dequeue();

在这里,我们存储在result中的东西是当您从队列q中出队时会返回的任何类型的东西。那么q存储什么类型的东西?查看参数,我们看到qQueue<T>,这意味着队列中的每个元素都是T类型。因此,我们需要给result指定类型T,因为它表示从队列中取出的单个元素。

另一方面,当我们写

Queue<T> temp = new Queue<T>();

目标是创建一个新的Queue,它可以容纳T类型的对象。为此,我们需要告诉Java我们希望它成为Queue<T>

这与我们声明result时不同的原因是我们正在尝试做根本不同的事情。 result旨在容纳单个项目,在这种情况下,其类型为Ttemp旨在存储项目的集合,因此我们将其设为Queue<T>来表示它不仅是单个T,而是它们的队列。

希望这会有所帮助!