#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 и весь день борюсь с этой проблемой. Поэтому я подумал, что попрошу о помощи. Не все люди ленивы. Спасибо вам за вашу помощь.