Может ли неуниверсальный класс реализовать универсальный интерфейс? - PullRequest
0 голосов
/ 22 января 2019

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

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

.

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

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

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

UPD: Я должен был прочитать этот раздел далее.Далее автор заявляет:

Конечно, если класс реализует определенный тип универсального интерфейса, такой как показано здесь: class MyClass implements Containment<Double> {, тогда реализующий класс не должен быть универсальным.

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

Ответы [ 3 ]

0 голосов
/ 23 января 2019

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

public class CaseInsensitiveComparator implements Comparator<String> {

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

Фактически, этот класс уже существует в JDK, хотя он реализован по-другому. Пожалуйста, см. String.CASE_INSENSITIVE_ORDER для получения дополнительной информации.

0 голосов
/ 23 января 2019

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

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

Наиболее распространенным является Comparable<T>* 1007.*.В Java 8 Javadoc перечислены 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
0 голосов
/ 22 января 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...