Правильная реализация сопоставимых и дженериков

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

public static String min(String a, String b) {
    if (a < b)
         return a;
    else
         return b;
}
    
public static String max(String a, String b) {
    if (a < b)
         return b;
    else
         return a;
}

И это моя попытка

public static <AnyType> min(<AnyType> a, <AnyType> b) {
    if (a < b)
         return a;
    else
         return b;
}
    
public static <AnyType> max(<AnyType> a, <AnyType> b) {
    if (a < b)
         return b;
    else
         return a;
}

Э-э, String — это ссылочный тип, поэтому вы не можете использовать операторы отношения <, <=, >, >=. Вы должны получить ошибку компилятора для «исходного» кода, который вы пытаетесь преобразовать. То же самое относится и к <AnyType>.

Old Dog Programmer 11.02.2023 04:45

Ты прав. Я не знал о любом типе, хотя. Я попробую это и посмотрю, что произойдет

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

Ответы 2

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

Вы должны убедиться, что AnyType сопоставимо.

public static <AnyType extends Comparable<AnyType>> AnyType min(AnyType a, AnyType b) {
    return a.compareTo(b) < 0 ? a : b;
}

public static <AnyType extends Comparable<AnyType>> AnyType max(AnyType a, AnyType b) {
    return a.compareTo(b) > 0 ? a : b;
}

Вы не сможете написать единственный метод compareTo, который будет работать для любого типа. Но вы можете написать min и max, которые будут правильно работать с любым типом implements Comparable.

Comparable — это интерфейс Java. У него есть метод compareTo, который не содержит кода. Для его использования требуется, чтобы метод compareTo был реализован для каждого класса, который его использует.

Использование интерфейса Comparable выглядит примерно так:

 public class Foo implements Comparable<Foo> { 

Это требует где-то в классе Foo этого:

     public int compareTo (Foo someFoo) { ... }

Где ... заменен кодом, специфичным для Foo.

Тогда класс, которому нужно сравнить две переменные типа Foo, может иметь такой код:

  Foo bar = new Foo();
  Foo bin = new Foo();
  ...
  if (bar.compareTo(bin) < 0) { ...

Если бы был другой класс, который implements Comparable, этому классу также потребовался бы compareTo метод, специфичный для этого класса.

Вы можете написать общие методы min и max, которые будут работать с несколькими классами, если эти классы реализуют Comparable. <T extends Comparable<T>> обеспечивает это.

public static <T extends Comparable<T>> T min (T a, T b) {
    if (a.compareTo(b) <= 0) return a;
    return b;
}
public static <T extends Comparable<T>> T max (T a, T b) {
    if (a.compareTo(b) >= 0) return a;
    return b;
}

Однако в этом случае дженерики не нужны. Java позволяет использовать имя интерфейса в качестве типа:

public static Comparable min (Comparable a, Comparable b) {
    if (a.compareTo(b) <= 0) return a;
    return b;
}
public static Comparable max (Comparable a, Comparable b) {
    if (a.compareTo(b) >= 0) return a;
    return b;
}

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