当前位置: 首页 > 知识库问答 >
问题:

将超类对象放入下界通配符列表时出错

许博达
2023-03-14

我明白,在列表中使用下界通配符作为方法参数应该让我们放置下界及其超级类型的元素,但请考虑以下代码:

public class WildcardError {
    void foo(List<? super Number> i) {
        i = new ArrayList<Integer>(); //compile error
        i.add(new Integer(2)); // no error
    }
}
public class WildcardError {
    void foo(List<? super Integer> i) {
        i = new ArrayList<Number>(); //no error
        Number k =20;
        i.add(k); // compile error
    }
}

我试图找到答案,但找不到确切的情况。

共有1个答案

刘和正
2023-03-14

在第一个示例中,下界?super number意味着实际类型参数可以是number或超类型(例如object)。因为Java的泛型是不变的,所以列表<?super Number>无法匹配ArrayList 。请记住,下限是对类型参数的限制,而不是对可能作为参数发送的参数类型的限制。调用add没有错误,因为整数可以传递给add方法,该方法可以接受数字或超类。

在第二个例子中,下界?超级整数意味着实际类型参数可以是integer或超类型(例如numberobject)。这与ArrayList 匹配,因此这里没有错误。但是,i的类型仍然是list<?超级整数>,它不能保证能够接受数字,例如K。它可以在任何时候引用列表 ,其中数字可能是不应接受。这就是为什么这里有一个编译器错误。

 类似资料:
  • 现在我正在尝试构建一个(灵活的)列表,并向其中添加不同类型的对象。 我可以将的实例添加到。但是,当我试图将或的实例添加到同一个列表中时,会出现编译错误。是否足够灵活,可以使用或其超级类的任何实例?和在层次结构树中位于较高位置。为什么我不能将这些实例添加到列表中?

  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • 问题内容: 我正在使用烧瓶和Redis。我决定尝试使用rom redis orm(http://pythonhosted.org/rom/)来管理一些较为复杂的数据结构。我有一个对象列表,可以说: 我也有rom模型: 这似乎在我的开发人员设置上起作用。我已经将大约25个“ Stored_url”对象加载到REDIS中(在cmd行中确认)。我正在尝试提出一种将所有Stored_url类型的对象放入p

  • 为什么会出现这种情况?请跟我解释一下。

  • 问题内容: 您能帮助我了解 无界通配符类型列表 和 原始类型列表 之间的区别吗? 除此之外,有人可以帮助我了解什么是有 界类型参数列表 ? 问题答案: 以下是这三个的摘要: :没有类型参数的列表。它是一个列表,其元素可以是任何类型- 元素可以是不同类型 。 :具有无限制类型参数的列表。它的元素是特定但未知的类型。 元素必须都是相同的类型 。 :带有类型参数称为的列表。所提供的类型必须是extens

  • 问题内容: 我有一个关于将子类列表分配给超类列表的基本问题。 所以我有以下内容: 为什么最后一次分配失败?对不起,新手问题 问题答案: 为了解释这一点,让我用整数代替“ B”,用数字代替“ A”。这只是为了使其更容易解释。 失败的原因是因为nList可以采用任何Number;可以采用Integer;可以采用Double;或者就此而言,可以是Number的任何子类。但是,对于iList并非如此。您不