Может ли неуниверсальный класс реализовать универсальный интерфейс?

Я читал "Java. Руководство для начинающих" Герберта Шильдта. В разделе об общих интерфейсах на одной странице автор пишет (выделено мной):

Any class that implements a generic interface must itself be generic.

И на следующей странице (выделено мной):

In general, if a class implements a generic interface, then that class must also be generic, at least to the extent that it takes a type parameter that is passed to the interface.

Итак, существуют ли какие-либо конкретные ситуации, когда неуниверсальный класс может реализовать универсальный интерфейс в Java? Или все такие классы являются универсальными в том смысле, что они «наследуют» эту общность от универсального интерфейса?

УПД: Мне нужно было прочитать этот раздел дальше. Далее автор заявляет:

Of course, if a class implements a specific type of generic interface, such as shown here: class MyClass implements Containment<Double> { then the implementing class does not need to be generic.

Это, я считаю, суть всех ответов на мой пост.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 608
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Можно создать неуниверсальный класс, реализующий универсальный интерфейс, при условии, что предоставлены параметры типа.

Относительно простой пример:

public class LocalDateParser implements Function<String, LocalDate> {
    public LocalDate apply (String s) {
        return LocalDate.parse(s);
    }
}

Конечно, вы можете назначить экземпляр этого класса только Function<String, LocalDate>, а не любому другому Function<T, R>.

Итак, когда реализуется определенный тип универсального интерфейса, реализующий класс не обязательно должен быть универсальным - хорошо. Но если в объявлении интерфейса используется параметр типа, то класс, реализующий интерфейс, также должен указать его, верно?

John Allison 22.01.2019 21:58

Каждый раз, когда класс или интерфейс поставляется с параметрами типа, они должны быть предоставлены. В противном случае это просто приводит к боли. Соответствующий вопрос: Что такое необработанный тип и почему мы не должны его использовать?

Joe C 22.01.2019 22:10

Я думаю, что автор явно не прав в обоих утверждениях. Универсальный класс — это класс, который принимает параметр универсального типа. И вы можете создать класс, который не принимает никаких параметров универсального типа, реализующих универсальный интерфейс:

public class CaseInsensitiveComparator implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
}

In fact, this class already exists in the JDK, though it's implemented differently. Please see String.CASE_INSENSITIVE_ORDER for further details.

Я думаю, именно это имел в виду Джо С. Я должен был прочитать раздел дальше. Далее автор заявляет: «Конечно, если класс реализует определенный тип универсального интерфейса, [...] тогда реализующий класс не обязательно должен быть универсальным». Так что я считаю, что это вопрос семантики.

John Allison 22.01.2019 22:12

@JohnAllison "должен сам по себе должен быть универсальным" - это не просто плохая семантика. Это не правильно! Существует больше случаев, когда неуниверсальные классы реализуют универсальный интерфейс, чем универсальные классы, реализующие универсальные интерфейсы с использованием одних и тех же аргументов.

Andreas 22.01.2019 22:19

Руководство, которое вы читаете, неверно.

Существует множество примеров необобщенных классов, реализующих обобщенные интерфейсы.

Самый распространенный — Comparable<T>. В javadoc Java 8 перечислены 152 реализующих класса, некоторые из которых передают в интерфейс аргумент универсального типа, поскольку все они должны указывать себя в качестве аргумента для Comparable, например.

public final class String implements Serializable, Comparable<String>, CharSequence
public final class Integer extends Number implements Comparable<Integer>
public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable

Другие вопросы по теме

Похожие вопросы

$JAVA_HOME не соответствует версии java в git bash (последнее обновление)
Мой код проходит все указанные тесты для CodingBat, но не проходит «другие тесты». Я не уверен, в чем моя проблема
API-интерфейс Spring Boot Rest - Querydsl, предикат не должен быть нулевым
Какой подходящий прослушиватель использовать для обнаружения движения/щелчка в текстовом поле JDatePicker?
Связь между сокетами перестает работать после одного сообщения. Боевой КорабльGame Swing
Загрузите зависимости java maven с помощью загрузчика классов java
Добавляет значение в связанный список вместо определенного значения — JAVA
Сайт не загружает ресурсы
Как использовать таблицы данных angular 6 с наблюдаемыми данными со стороны сервера (MySQL, Java, Springboot и спящий режим) или как преобразовать наблюдаемые в массив?
Как поставить что-то вроде точки с запятой или двоеточия после запроса у пользователя подсказки в Java