调用AWS Batch Meter通用API

问题描述

我必须调用通用的AWS Batch Meter API。当我调用函数时,出现错误。请帮助如何调用通用API

public <T> Optional<T> getValueForField(String fieldName,Class<T> clazz) {
        byte var4 = -1;
        switch(fieldName.hashCode()) {
        case -1532767274:
            if (fieldName.equals("Results")) {
                var4 = 0;
            }
            break;
        case 743387085:
            if (fieldName.equals("UnprocessedRecords")) {
                var4 = 1;
            }
        }

        switch(var4) {
        case 0:
            return Optional.ofNullable(clazz.cast(this.results()));
        case 1:
            return Optional.ofNullable(clazz.cast(this.unprocessedRecords()));
        default:
            return Optional.empty();
        }
    }

public List<UsageRecordResult> results() {
        return this.results;
    }

通过API调用

batchMeterUsageResponse.getValueForField(RESULT,(Class<List<UsageRecordResult>>) new ArrayList<>().getClass());

我遇到错误

Error:(98,175) java: incompatible types: java.lang.class<capture#1 of ? extends java.util.ArrayList> cannot be converted to java.lang.class<java.util.List<software.amazon.awssdk.services.marketplacemetering.model.UsageRecordResult>>

解决方法

TL; DR —如果我对您的代码意图的假设是正确的,则the simplest solution is demonstrated here

...
Optional< List > wtTF = batchMeterUsageResponse.getValueForField( RESULTS,List.class );
...

要执行上面显示的代码,请单击绿色的 开始 按钮at the top of this IDE


详细答案

BatchMeterUsageResult有一个getResults()方法和一个getUnprocessedRecords()方法,看起来就像您在问题中使用的方法一样。因此,我上面建议的修复程序假设您的示例代码旨在返回 List<UsageRecordResult> List<UsageRecord> ;取决于 fieldName.hashCode 的值。

我遇到错误:

Error:(98,175) java: incompatible types: java.lang.Class<capture#1 of ? extends java.util.ArrayList> cannot be converted to java.lang.Class<java.util.List<software.amazon.awssdk.services.marketplacemetering.model.UsageRecordResult>>

该错误消息告诉您,您尝试从一种类型的 Class<List<E>> 转换为另一种类型的 Class<List<E>> 失败。

编译器知道 Class new ArrayList<>().getClass() 类型为 Class<capture#1 of ? extends java.util.ArrayList> 。您正在尝试将其投射到 Class<List<UsageRecordResult>>

因为两种 Class 类型不兼容,所以编译器无法进行转换。它们不兼容的根本原因是因为 {List<UsageRecordResult> 不符合以下条件: extends java.util.ArrayList 。请记住:接口 List<E> ArrayList<E> 超类。如您所知,不可能将超类分配给子类。

但这只是代码问题的第一部分。其他问题的细节可能不如上述使代码编译的解决方案那么有趣。

如果我对您的代码意图的假设不正确,那么请编辑您的问题,并提供对代码实际意图的更清晰的解释? TIA。