【问题标题】:How to access elements from passed generic arraylist如何从传递的通用数组列表中访问元素
【发布时间】:2020-03-09 10:24:46
【问题描述】:

当您传递 arraylist 时,我无法弄清楚 java 中的泛型方法是如何工作的。

所以基本上我有几个 DTO,例如:TypeAwesome、TypeGreat、TypeNotSoGreat

这些 DTO 从一个文本文件中读取(每个都来自它们自己的),我有一些我想使用的 getter。

DTO 表示 csv 文件中的每一行,我将这些 DTO 对象保存到 ArrayList 中,如下所示:

ArrayList<TypeAwesome> list = new ArrayList<>();
for (int i = 1; i < lineCount; i++) {
    typeAwesome = new TypeAwesome();
    ...
    list.add(typeAwesome); 
}
return fileHelper.checkFinalResult(list);

如您所见,我正在传递该列表。

我的目标是无论我发送的列表类型是什么,我都想获得该列表属性和吸气剂。

基本上我会收到这样的错误:

  • 无法解析 T 中的方法“get”
  • 无法解析 T 中的方法“大小”
  • 无法解析 T 中的方法“get”
  • foreach 不适用于类型 T

    public <T extends Base> String checkFinalResult(List<T> list) {
        String finalStatus = "FAIL";
        List<String> statuses = new ArrayList<>();
    
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getRezultat());
            String status = list.get(i).getRezultat().equalsIgnoreCase("OK") ? "PASS" : "FAIL";
            statuses.add(status);
            // returns last result - to determine if whole test failed or not
            if (i == list.size() - 1) {
                if (list.get(i).getRezultat().equalsIgnoreCase("OK")) {
                    finalStatus = "PASS";
                }
            }
        }
        System.out.println("STATUSES: " + statuses);
        int index = 0;
        for (T item : list) {
            // get status
            item.status = statuses.get(index);
            System.out.println("ITEM STATUS " + item.status);
            index++;
        }
        return finalStatus;
    }
    

如何传递某种类型的 ArrayList 以便 get 方法在该列表上工作,还有其他方法可以实现我想要实现的目标吗?

编辑:我已经进行了必要的修复并实现了基类,如 cmets 中所述: 基类:

public class Base {
    public String rezultat;
    public String status;
    public String getRezultat() {
        return rezultat;
    }
}

我现在在上面遇到错误:

return fileHelper.checkFinalResult(list);

必填类型: 列表 假如: 列表 原因:不存在类型变量的实例,因此 TypeAwesome 符合 Base

这是什么意思,我必须创建那个实例才能使 TypeAwesome 符合 Base 吗?

【问题讨论】:

  • 恕我直言,方法签名必须是public &lt;T&gt; String checkFinalResult(List&lt;T&gt; list, Class&lt;T&gt; type) {...}
  • @spa type 参数有什么意义?

标签: java generics arraylist


【解决方案1】:

我相信您真正想要的是 List 包含泛型类型。所以你的方法签名应该是:

public <T> checkFinalResults(List<T> list) {...}

这将使您通过当前的错误,但您正在尝试对 List 的元素调用 getRezultat() 方法。如果您的每个 DTO 都扩展了一个公共基类或实现了一个公共接口,那么您可以通过在泛型定义中指定 this 来访问该类型的方法。例如

public <T extends HasRezultat> checkFinalResults(List<T> list) { ... }

【讨论】:

  • 非常感谢您,并感谢您提供更多信息!完成后我会回来发布我的解决方案。
  • 嗨 vsfDawg,你介意帮我再发一点我在编辑时发布的内容吗?
猜你喜欢
  • 2011-06-05
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2018-02-06
相关资源
最近更新 更多