- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
具有两种不同类型的两个列表的方法。你根本不能那样做。自 GetResponse
用 T
参数化, 列表中元素的类型必须恰好是 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/
我是一名优秀的程序员,十分优秀!