当前位置: 首页 > 面试题库 >

通配符的目的是什么?它们与泛型有何不同?

郑博
2023-03-14
问题内容

直到几天前,我才听说过野车,在读完我的老师的Java书籍后,我仍然不确定它的用途以及为什么需要使用它。

比方说,我有一个超类Animal和几个子类都DogCatParrot,等…现在我需要有动物名单,我首先想到的会是这样的:

List<Animal> listAnimals

相反,我的同事们建议采取以下措施:

List<? extends Animal> listAnimals

为什么要使用通配符而不是简单的泛型?

假设我需要一个get / set方法,应该使用前一种还是后一种?它们有何不同?


问题答案:

声明局部变量时,通配符没有多大意义,但是当为方法声明参数时,通配符确实很重要。

假设您有一个方法:

int countLegs ( List< ? extends Animal > animals )
{
   int retVal = 0;
   for ( Animal cur : animals )
   {
      retVal += cur.countLegs( );
   }

   return retVal;
}

使用此签名,您可以执行以下操作:

List<Dog> dogs = ...;
countLegs( dogs );

List<Cat> cats = ...;
countLegs( cats );

List<Animal> zoo = ...;
countLegs( zoo );

但是,如果您这样声明countLegs

int countLegs ( List< Animal > animals )

然后,在前面的示例中,仅countLegs( zoo )会编译,因为只有该调用具有正确的类型。



 类似资料:
  • 使用PEP 557,将数据类引入python标准库。 它们使用了装饰器,它们应该是“带默认值的可变名称耦合”,但我不太清楚这到底意味着什么,以及它们与普通类的区别。 python数据类到底是什么?什么时候最好使用它们?

  • 我对代表什么感到困惑。根据它的留档,所有整数类型都是0。的浮点类型公式看起来类似于的的。

  • 问题内容: 下列类定义了两种方法,它们在直观上都具有相同的功能。每个函数都有两个类型和一个布尔值的列表来调用,该值指定应将这些列表中的哪个分配给局部变量。 根据,有效而无效。它抱怨: 我知道查找包含三元运算符()的表达式类型的规则非常复杂,但是据我了解,它选择了最具体的类型,第二个和第三个参数都可以转换为该类型,而无需显式投。在这里,应该是,但不是。 我想解释一下为什么不是这种情况,最好参考 Ja

  • 这个问题的答案表明,当方法采用通配符泛型类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 据我所知,方法do1有,因此d2只能被访问,不能被修改。方法d2具有,因此可以访问和修改c2,并且没有编译错误。 通用指南

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

  • 问题内容: 假设您有一个数字。中的值可以是类型,等等。声明时,可以使用通配符()声明,也可以不使用通配符。 所以,现在我想在和它所有的使用(显然下面的代码只是为了说明问题的例子)。让我们开始流式传输: 但是,我不能在:上执行相同的操作 编译器在调用时抱怨以下消息: Test.java:找不到符号 symbol:方法intValue() 位置:java.lang.Object类型的变量编号 从编译器