#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>{}