Что означает этот тип универсального класса в Java?

#java #generics

#java #дженерики

Вопрос:

Я уже знаю основы дженериков на Java, но это меня смущает…

Что это значит в Java?

 public class SampleClass<Integer> {
    ....
}


public class UserClass {
    public static void main(String[] args) {
        SampleClass<String> s = new SampleClass<>();
    }
}
 

этот компилируется без ошибок.

Я думал, что когда вы создаете универсальный класс в java, вам нужно использовать только одну заглавную букву при этом. Например:

 public class SampleClass<T>  {
    ....
}
 

Но почему java позволяет создавать универсальный класс с определенным параметром типа, например, первый, который я написал, который использует Integer параметр типа?

И почему, когда я создаю экземпляр SampleClass in UserClass , он принимает String тип в качестве параметра типа, когда я сконструировал параметр SampleClass типа класса как Integer ? Я думал, что это вызовет ошибку, поскольку SampleClass был создан с Integer параметром типа.

Может кто-нибудь, пожалуйста, просветить меня по этому поводу? Я немного смущен этим. Спасибо…

Комментарии:

1. Где вы видели этот пример?

2. @chrylis-осторожно оптимистично — в книге Роберта Седжвика «Алгоритмы» в книге используется этот тип кода

3. @chrylis-осторожно оптимистичный — хотя Integer это не точный тип, используемый в классе

4. Хорошо… некоторые авторы книг являются «законом для самих себя» 🙂

5. Это вопрос мнения. Однако, очевидно, это вас смутило… и (IMO) это, скорее всего, смутило бы (и раздражало!) Большинство практикующих разработчиков Java. Делайте свои собственные выводы.

Ответ №1:

Я думал, что когда вы создаете универсальный класс в java, вам нужно использовать только одну заглавную букву при этом.

Это неверно.

Спецификация языка Java позволяет использовать любой идентификатор для переменных универсального типа. Использование одной заглавной буквы (или очень короткого имени с заглавными буквами) — это просто соглашение о стиле Java, хотя и важное.

Итак, в вашем примере вы использовали Integer в качестве имени переменной типа. Это может вызвать путаницу у кого-то, кто читает ваш код, и проблему для вас, если вам также нужно обратиться к стандартному Integer классу внутри SampleClass .

Комментарии:

1. Я видел этот код в книге Роберта Седжвика «Алгоритмы». Я немного смущен стилем кодирования, используемым в этой книге

2. Что ж, Роберту, вероятно, следует более внимательно ознакомиться со стандартными руководствами по стилю Java. Однако он волен писать в своих книгах все, что захочет … при условии, что его редактор не подтянет его. Мой вам совет — не копировать этот аспект его стиля.

Ответ №2:

Соглашение заключается в использовании одной буквы для переменных типа, но это не является обязательным требованием; переменные типа могут быть любым идентификатором Java. ( ID поскольку переменная типа является частым исключением из соглашения.) Вы объявляете переменную типа с именем Integer , которое является shadowing java.lang.Integer .

Ответ №3:

Как уже указывали другие, вы использовали Integer там, где обычно используется T for Type , точно так же, как обычно используется обычный

K для key

E для element

V для value

Это просто соглашение. Также довольно часто используется S , U , V если есть более общие параметры типа

Если вы хотите установить границы для своего универсального класса, чтобы он принимал только числовые типы, тогда вы бы использовали что-то вроде этого

 class SampleClass<T extends Number>{}