Java - статический универсальный тип с использованием Comparable

Хорошо, поэтому я пытался реализовать простое двоичное дерево поиска, которое по умолчанию использует сопоставимый тип данных.

Игнорируя все мои другие методы в классе, это общая настройка, которая у меня есть, и я считаю ее довольно стандартной:

public class BSTNode<E extends Comparable<? super E>>{
     E data;
     BSTNode<E> left;
     BSTNode<E> right;
     //and I'm trying to define a static method(inside of the class) like this:
     public static <E> String displayAscending(BSTNode<E> node){} 
}

Но компилятору это не нравится. Теперь я как бы новичок в общих типах, поэтому я объясню свое понимание того, что это делает, и это может помочь вам понять, что не так с моим мышлением.

E расширяет Comparable Итак, в основном объект E, который является расширением Comparable. Сравнимо наличие элемента, который является предком E, что по сути является абстрактным способом сказать, что E можно сравнить с другими его элементами с помощью интерфейса Comparable.

Затем в моем статическом методе я пытаюсь рекурсивно передать BSTNode. Я не могу понять, почему это не работает. Я знаю, что если я пройду BSTNode<?>, он будет работать нормально, но это кажется опасным. Если бы кто-нибудь мог объяснить мне, ПОЧЕМУ это не работает, я бы попытался найти другое решение.


person Community    schedule 13.02.2012    source источник


Ответы (1)


попробуй это

public static <E extends Comparable<? super E>> String displayAscending(BSTNode<E> node)
person brettw    schedule 13.02.2012
comment
Это сработает, если вы это сделаете. То же самое с BSTNode ‹?›, Но мне интересно, почему ссылка на E таким образом, как я, вызывает у меня проблемы. Я хотел бы убедиться, что передаваемый объект является сопоставимым. - person ; 13.02.2012
comment
Кроме того, я заставил это работать: public static <T extends Comparable<? super T>> String displayAscending(BSTNode<T> node) Я все еще хотел бы знать, почему мой приведенный выше код вызывает у меня проблемы. - person ; 13.02.2012
comment
Это создает проблемы, потому что E не имеет ограничений типа в displayAscending, но он должен удовлетворять вашему E extends Comparable<? super E> в классе, который будет использоваться в BSTNode<E>. Какую букву вы используете (_5 _ / _ 6_ / что угодно) не имеет значения, поэтому она по-прежнему работает, когда вы переходите на использование T. - person mange; 13.02.2012
comment
О, я мог бы поклясться, что это выдало мне ошибку, когда я использовал E, но я просто попробовал, и все в порядке. В общем, поскольку он статичен, я должен убедиться, что он покрывает ограничения класса. Думаю, теперь я лучше понимаю, как работают статические методы. Спасибо :). - person ; 13.02.2012