【问题标题】:Error with wildcard on Generics泛型上的通配符错误
【发布时间】:2015-10-30 13:48:51
【问题描述】:

我正在使用 Android Studio 开发一个应用程序。

我尝试将Object 放入ArrayMap 时出错。

private ArrayMap<String, ? extends Tracker> trackers;

public void addTracker(@NonNull Tracker tracker) {
    trackers.put(tracker.getName(), tracker);
}

我希望我将继承自 Tracker 类的任何类型的对象添加到我的 ArrayMap

IDE 说它无法解析 put 方法的参数 (String, Tracker)

知道为什么吗?

【问题讨论】:

  • 尝试私有 ArrayMap 跟踪器
  • 这个声明允许做trackers = new ArrayMap&lt;String, Thing&gt;(); where Thing extends Tracker。既然这是授权的,那么trackers.add(tracker.getName(), tracker)是不允许的,因为trackers可能限制性更强。

标签: java android generics android-studio wildcard


【解决方案1】:

trackers 的第二个泛型参数可以是任何类型的Tracker,因此编译器会阻止添加直接实例。您可以将其声明为

private ArrayMap<String, Tracker> trackers;

【讨论】:

  • 如果我按照你说的做,那么我不能放任何继承自Tracker的对象,可以吗?
  • 为什么不呢? ArrayMap&lt;String, Tracker&gt; 将允许所有子类类型
  • 它有效,但我不明白为什么。来自 Oracle 文档:Given that Integer is a subtype of Number, what is the relationship between List&lt;Integer&gt; and List&lt;Number&gt;? List&lt;Integer&gt; is not a subtype of List&lt;Number&gt; and, in fact, these two types are not related. 所以我预计 ArrayMap&lt;String, Tracker&gt; 不是 ArrayMap&lt;String, CustomTracker&gt; 的父级,如果 CustomTracker 继承自 Tracker
  • @DanieleVitali 引用的是泛型类型声明,但可以传入以非泛型方式声明的任何类型的 Tracker...
  • 谢谢@Reimeus。在您上次发表评论后还有一个问题。那么Map&lt;String, Tracker&gt;Map&lt;String, ? super Tracker&gt;有什么区别呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多