【问题标题】:Finding max of array using generic E[] array使用通用 E[] 数组查找数组的最大值
【发布时间】:2021-02-07 02:36:05
【问题描述】:

我对泛型很陌生,如果答案很明显,请见谅。

我有一个函数 max 可以找到数组中的最大值。我正在尝试使用通用数组 E[] 以便可以将任何对象数组传递给它,但是在尝试对其进行测试时,我发现(除非我做错了什么)实际上只需要 E [] 数组...IDE 一直告诉我我做不到。

import java.lang.reflect.Array;

public class Max {
public static <E extends Comparable<E>> E max(E[] list) {

    E comp1 = null;

    for (E e : list) {
        for (int j = 0; j < list.length; j++) {
            comp1 = list[0];
            if (comp1.compareTo(e) > 0) {
                comp1 = e;
            }
        }
    }
    return comp1;
}

public static <E> void main (String[] args) {
    Boat boat = new Boat(1,2);
    Soda pepsi = new Soda(1,2);
    Comparable<E>[] oa = new Comparable[100];
    Object[] boats = new Boat[20];
    Object[] objects = new Object[1];
    Object stuff = null;

    final E[] a = (E[]) Array.newInstance(1,1);
    E e1 = (E) boat;
    E e2 = (E) pepsi;
    E e3 = (E) stuff;
    
    E[] es = {e1,e2,e3};

    Comparable<E>[][] es = {oa};

    System.out.println((String) max(objects[0]));
    }
}

正如您从底部的 main 方法中看到的那样,我尝试使用对象、对象数组以及 Comparable 对象和所述对象的数组。 max() 拒绝它们,坚持它只获得 E[] 类型。它作为此错误的一部分给出:“原因:不存在类型变量 E 的实例,因此 Object 符合 E[]。”我的目标是用任何对象数组测试 max() 方法,但似乎我误解了泛型在数组的情况下是如何工作的。任何帮助或解释将不胜感激。

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

    通常:

    • 您的泛型方法应使用泛型类型。
    • 无论怎样称呼它都应该使用具体类型。

    你的 max 方法有逻辑错误,但它使用泛型是正确的。

    由于您的 main 方法正在向其传递数组,因此 main 方法不应该使用泛型。

    public class Max {
        public static <E extends Comparable<E>> E max(E[] list) {
        
            E comp1 = list[0];
        
            for (E e : list) {
                if (comp1.compareTo(e) < 0) {
                    comp1 = e;
                }
            }
            return comp1;
        }
        
        public static void main (String[] args) {
            String[] words = {"Don't", "overcomplicate", "your", "generics"};
            Integer[] ints = {5, 14, 4, 8};
            
            System.out.println(max(words));
            System.out.println(max(ints));
        }
    }
    

    【讨论】:

    • 感谢您的解释。我想我从一开始就走错了思路,最终在这个过程中把这一切都复杂化了。记住关键是简单地传入一个要比较的字符串数组会有所帮助,我也很感激指出我犯的逻辑错误。我会先尝试自己解决,如果我无法解决,请参考您的解决方案。
    • 完全没问题。你自己已经走了很远,我相信一旦你能够运行它,你就会很快发现逻辑错误。
    【解决方案2】:

    您在这里处理两个不同的 E 版本。 每种方法都定义了自己的 E 版本,并且只有 max 中的一个扩展了 Comparable。无论如何,使 main 方法泛型没有任何意义,因为输入将始终是一个字符串数组,因此请删除它,并使用任何实际可比较类型的数组测试您的 main 方法,例如字符串。

    这应该编译:

    public class Max {
        public static <E extends Comparable<E>> E max(E[] list) {
    
            E comp1 = null;
    
            for  (E e : list) {
                for (int j = 0; j < list.length; j++) {
                    comp1 = list[0];
                    if (comp1.compareTo(e) > 0) {
                        comp1 = e;
                    }
                }
            }
            return comp1;
        }
    
        public static void main (String[] args) {
            System.out.println(max(args));
        }
    }
    

    【讨论】:

    • 感谢您解释“E”在每种方法中的工作原理。知道它们不是同一件事会很有帮助(我想我应该已经意识到这一点,因为我从未在任何一种方法之外创建实例变量 E),并且应该区别对待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2013-11-04
    • 2014-06-26
    • 2021-06-17
    • 2010-09-18
    • 2016-08-12
    • 2012-08-14
    相关资源
    最近更新 更多