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

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

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
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
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;
}

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