gpt4 book ai didi

java - 泛型问题java

转载 作者:行者123 更新时间:2023-12-03 20:24:23 25 4
gpt4 key购买 nike

public class GetResponse <T extends KeywordIdentifier>{

private List<KeywordMetrics<T>> metrics = null;


public List<KeywordMetrics<T>> getMetrics(){
return this.metrics;
}

public void setMetrics(List<KeywordMetrics<T>> metrics){
this.metrics = metrics;
}
}


public class AdWordsKeywordIdentifier extends KeywordIdentifier {
//body
}
public class BingKeywordIdentifierextends KeywordIdentifier {
//body
}


GetResponse<? extends KeywordIdentifier> result= new GetResponse<AdWordsKeywordIdentifier>();
List<KeywordMetrics<AdWordsKeywordIdentifier>> stats = getGoogleStats();
List<KeywordMetrics<BingKeywordIdentifier>> stats2 = getBingStats();
result.setMetrics(stats);
result.setMetrics(stats2);

result.setMetrics(stats) 方法产生编译错误。

ERROR (The method setMetrics(List<KeywordMetrics<capture#2-of ?extends KeywordIdentifier>>) in the type GetResponse<capture#2-of ?extends KeywordIdentifier> is not applicable for the arguments(List<KeywordMetrics<AdWordsKeywordIdentifier>>)

能否请您解释一下这是为什么以及我该如何解决?

最佳答案

需要申报result它是什么,即 GetResponse<AdWordsKeywordIdentifier> .

编辑:

看着您的更改,我发现了一个大问题。您正在尝试调用 setMetrics具有两种不同类型的两个列表的方法。你根本不能那样做。自 GetResponseT 参数化, 列表中元素的类型必须恰好是 T , 即 AdWordsKeywordIdentifier BingKeywordIdentifier ,不可能两者兼而有之。编译器提示是因为 GetResponse有类型参数 ? extends KeywordIdentifier并且它不可能推断出实际的类型参数是什么,因此它不能静态地确保对 setMetrics 的方法调用的类型安全。 ,也就是说,您将永远无法调用它。

但并非所有都丢失了。您必须做出选择:要么保留您的通用类并始终强制执行强类型,要么您可以使该类不是通用类并修改 metrics字段如下:

class GetResponse {

private List<? extends KeywordMetrics<? extends KeywordIdentifier>> metrics = null;

public List<? extends KeywordMetrics<? extends KeywordIdentifier>> getMetrics() {
return this.metrics;
}

public void setMetrics(List<? extends KeywordMetrics<? extends KeywordIdentifier>> metrics) {
this.metrics = metrics;
}
}

现在仅适用于您的原始代码段:

GetResponse result = new GetResponse();
List<KeywordMetrics<AdWordsKeywordIdentifier>> stats = new ArrayList<>();
List<KeywordMetrics<BingKeywordIdentifier>> stats2 = new ArrayList<>(); result.setMetrics(stats);
result.setMetrics(stats2);

这完全取决于您要实现的目标。上面的代码仍然是类型安全的。既然你说你想要你的代码“通用”,你必须放弃在编译时知道你的列表的确切类型(它现在是 ? extends KeywordMetrics<? extends KeywordIdentifier> 的列表)。

请注意,进行此编译需要双通配符。 List<KeywordMetrics<BingKeywordIdentifier>> 是一个 List<? extends KeywordMetrics<? extends KeywordIdentifier>>但它不是 List<KeywordMetrics<? extends KeywordIdentifier>> .

关于java - 泛型问题java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23565619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com