Лучший способ реализовать дженерики в методах?

#java #generics

#java #дженерики

Вопрос:

У меня возникли проблемы с упражнением по программированию, потому что в книге, которую я читаю, показано только, как использовать общие методы печати. Что просто. Но в упражнении предлагается найти наибольшее и наименьшее значение ArrayList . Я нашел способ сделать это, показанный в моем коде, но я просто думаю про себя, какой смысл использовать дженерики в первую очередь?

Вот инструкции по выполнению упражнения:

Напишите универсальный класс с именем myList с параметром типа T. Параметр типа T должен быть ограничен верхней границей: классом Number . Класс должен иметь в качестве поля список массивов T. Напишите открытый метод с именем add, который принимает параметр типа T. Когда методу передается аргумент, он добавляется в ArrayList . Напишите два других метода, самый большой и самый маленький, которые возвращают наибольшее и наименьшее значения в ArrayList .

Мой код:

 //Main

import java.io.*;
import java.util.*; 

public class Main {

    static PrintWriter writer = new PrintWriter(System.out, true);

    public static void main(String[] args) throws IOException {

        ArrayList<Integer> list = new ArrayList<>();

        MyList<Integer> myList = new MyList<>(list);

        myList.add(3);
        myList.add(5);
        myList.add(44);
        myList.add(654);

        int first = myList.getArrayList().get(0);
        int largest = 0;
        int smallest = 0;

        for (int i = 1; i < list.size(); i  ) {
            largest = myList.getLargest(first, myList.getArrayList().get(i));
            smallest = myList.getSmallest(first, myList.getArrayList().get(i));
        }

        System.out.println("Largest: "   largest   "nSmallest: "   smallest);

    }
}

//MyList Class

import java.util.ArrayList;

public class MyList <T extends Number> {
    private ArrayList<T> arrayList;

    public MyList(ArrayList<T> arrayList) {
        this.arrayList = arrayList;
    }

    public void add(T item) {
        arrayList.add(item);
    }

    public ArrayList<T> getArrayList() {
        return arrayList;
    }

    public int getLargest(int x, int y) {
        return Math.max(x, y);
    }

    public int getSmallest(int x, int y) {
        return Math.min(x, y);
    }
}
 

Если я попытаюсь написать методы с T типами, я получу ошибки при использовании таких операторов, как > или и Math.max() также не будет работать. Я понимаю, почему сейчас, я просто не понимаю, какой тип я должен возвращать и вводить для методов. int, Integer или T? И если бы я хотел использовать ArrayList с использованием удвоений, что тогда, чтобы методы могли работать с обоими типами?
Любой вклад в то, что было бы лучшим способом решить эту проблему с использованием дженериков, был бы весьма признателен. Спасибо.

Комментарии:

1. Я думаю, что ваш getLargest / getSmallest реализован неправильно. Вероятно, они должны быть чем-то вроде public T getLargest() , и реализация находит наибольшее this.arrayList значение.

Ответ №1:

Я не буду делать за вас домашнее задание, но я могу направить вас на правильный путь…

1 — Я бы определил свой ArrayList и инициализировал его в той же строке (и не требовал, чтобы пользователь указывал его в конструкторе).

 public class MyList<T extends Number> {
  private ArrayList<T> arrayList = new ArrayList<T>();
 

2 — Определите ваши два метода для возврата T

 public T getLargest() {
}

public T getSmallest() {
}
 

3 — Вы захотите преобразовать все в Double (максимально возможная реализация числа)

 T largest = (T) Double.valueOf(0f);

T smallest = (T) Double.valueOf(Double.MAX_VALUE);
 

4 — Перебирайте все числа в вашем свойстве ArrayList и выполняйте соответствующие сравнения

 for (T number : numbers) {
  // because T is an extension of Number, we can invoke the doubleValue method
  // offered on the Number class
  // convert your T variables to doubles
  double v = number.doubleValue();

  // you can then compare the doubleValue to keep the largest/smallest values.
}
 

Надеюсь, это было полезно, не выполняя за вас домашнюю работу. 🙂

Комментарии:

1. Спасибо за помощь, но это не моя домашняя работа. Я самостоятельно изучаю C и весь день борюсь с этой проблемой. Поэтому я подумал, что попрошу о помощи. Не все люди ленивы. Спасибо вам за вашу помощь.