2016-04-02 3 views
1

Если бы я должен был создать класс, и этот класс должен принимать только определенный тип данных. Я бы начал использовать generics, и в этом классе я перейду к типу, ограниченному верхней границей класса Number.Уточнение Java Generics (ограничение T на тип при использовании Comparable)

Таким образом, этот класс может использовать только типы класса Number или подклассы Number (Integer, Double, Long и т. Д.).

Позволяет сказать, что у меня есть массив этих типов, и я хочу сравнить значения в этом массиве. Таким образом, этот класс содержит массив только этих разрешенных типов данных, и мы хотим сравнить только эти типы.

Мы можем сделать это, используя сопоставимый интерфейс, который содержит метод compareTo. Вы можете использовать метод compareTo только для классов, реализующих интерфейс Comparable. Число является одним из классов, реализующих этот интерфейс.

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

public class SomeName<T extends Number> { 

Это успешно подразумевает ограничение типа Т только принимать типы Number или подклассы числа. Если бы я хотел использовать метод compareTo из интерфейса Comparable, который класс Numbers реализует, с которым T ограничено.

Если бы я иметь такой метод, как

public T someName(T[] SomeVariable) { 

Почему этот метод не может использовать метод CompareTo? Т связи к классу чисел, который реализует Сопоставимым.

Если бы я иметь

public <T extends Comparable<T>> someName(T[] SomeVariable) { 

Тогда это работает, потому что T расширяет сопоставимым, который является samething, как T реализует сопоставимой в родовом обозначении ... Это не то, что практически то же самое, что и выше, хотя?

+1

Ну, номер делает ** не ** реализуется Сравнительно ... http://docs.oracle.com/javase/8/docs/api/java/lang/Number.html –

ответ

4

Numberне реализация Comparable.

Дело использовать это:

SomeName<T extends Number & Comparable<? super T>> 

В настоящее время вы не можете наложить дополнительные ограничения на T в метод экземпляра, так что если вы пишете

public <T extends Comparable<T>> T someName(T[] SomeVariable) 

, что на самом деле отличается T.

+0

Я не уверен, где я сопоставимо количество реализованных номеров. Я, должно быть, перепутался. Итак, вы говорите, что тип T в заголовке класса отличается от T в заголовке метода? Это имеет смысл. Я ценю помощь. – pudge

+0

Обычно, если вы ссылаетесь на 'T' в методе, это тот же' T', что и в начале класса. Например. в 'public T someName (T [] SomeVariable)', 'T' совпадает с верхним. Если вы объявляете 'T' в' <> 'перед типом возвращаемого значения, это общий метод, а' T' - это другой параметр типа. Если вы это сделаете, вы действительно должны использовать что-то другое, например 'U', потому что тогда вы можете ссылаться как на' T', так и 'U'. –

+0

Спасибо, я ценю вашу помощь.Я собираюсь продолжить изучение этого раздела, пока не полностью его улажу. До сих пор я делал несколько программ с использованием дженериков, и это помогает понять это гораздо больше. – pudge

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