2013-12-15 5 views
1

я определил следующий класс:параметр Джокер в методе

public class priorityQueue<T extends Comparable<T>> implements Iterable<T> 

Он содержит следующие методы:

  • общественного логический Нажмите (Т узел)
  • общественных Т Поп()
  • общественный Итератор итератор()

I нужно написать метод, который копирует элементы из коллекции в PriorityQueue

public static<T> void copy(Collection<T> source, priorityQueue<? extends Comparable<T>> dest) { 
    for(T elem:source){ 
     dest.Push(elem); 
    } 

} 

я получаю ошибку:

The method Push(capture#1-of ? extends Comparable<T>) in the type priorityQueue<capture#1-of ? extends Comparable<T>> is not applicable for the arguments (T) 

Почему я не могу написать метод:

public static<T> void copy(Collection<T> source, priorityQueue<T extends Comparable<T>> dest) 

I получить сообщение об ошибке:

Syntax error on token "extends",, expected 

Как я могу объявить метод для копирования элементов?

+0

По соглашению в именах классов Java начинается с верхним регистром (так PriorityQueue будет выбор) и имена методов начинаются с строчными буквами, поэтому метод Нажмите должны быть толчком. –

+0

Я не использую методы из Java.util, и я не хотел их переопределять, я определил свой собственный priorityQueue своими собственными методами. – user3042601

+0

Вы бы не переопределили PriorityQueue, используя одно и то же имя, если у вас есть другое местоположение пакета. Кроме того, предпочитают использовать имена, которые отличаются от стандартных библиотек, таких как MyPriorityQueue. Любой, кто читает код, включая вас в будущем, это оценит. –

ответ

2

Поскольку T уже определена в этой точке, попробуйте это вместо

public static<T extends Comparable<T>> 
void copy(Collection<T> source, priorityQueue<T> dest) {} 
+0

Это единственный правильный ответ до сих пор. –

0

Вы пытаетесь использовать маску неопределенного типа в статическом методе. Будучи статическими, подстановочные определения класса недопустимы, и вам нужно указать их в методе.

Добавить другие подстановочный, поэтому метод заканчивается так:

public static<T, P extends PriorityQueue<Comparable<T>>> void copy(Collection<T> source, P dest) { 
    for(T elem:source){ 
     dest.Push(elem); 
    } 
} 
+0

Вы попробовали? Он не будет компилироваться. –

+0

Да, я попробовал и да, он компилируется. Я использовал его несколько раз недавно. То, что я заметил, также заключается в том, что это избыток требований OP, и ответ от @Elliot Frisch намного проще (и включает в себя «extends Comparable », который я забыл). –

+0

Я не вижу, как ваш метод стоит, компиляции. Метод 'push' для' P' ожидает 'Comparable ', тогда как вы просто нажимаете элементы из 'Collection ', где 'T' не имеет границ. –

Смежные вопросы