繁体   English   中英

在方法中实现 generics 的最佳方法是什么?

[英]Best way to implement generics in methods?

我在编程练习时遇到问题,因为我正在阅读的书只展示了如何使用 print 泛型方法。 这很容易。 但该练习要求找到 ArrayList 的最大值和最小值。 我想出了一种方法,在我的代码中显示,但我只是在想,首先使用 generics 有什么意义?

以下是练习说明:

使用类型参数 T 编写一个名为 MyList 的通用 class。类型参数 T 应限制为上限:数字 class。 class 应该有一个 T 的 ArrayList 作为字段。编写一个名为 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() 也不起作用。 我现在明白为什么了,我只是不明白我应该为方法返回和输入什么类型。 整数,Integer,还是 T? 如果我想使用 ArrayList 使用双打,那么这些方法可以同时使用这两种类型吗? 任何有关使用 generics 解决此问题的最佳方法的输入将不胜感激。 谢谢你。

我不会为你做作业,但我可以让你走上正轨……

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(最大可能的 Number 实现)

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.
}

希望这对您有所帮助,而无需为您做功课。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM