前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用通配符和泛型:完成父子类关系的List对象的类型匹配

使用通配符和泛型:完成父子类关系的List对象的类型匹配

作者头像
用户1172465
发布2018-01-08 14:31:22
1.6K0
发布2018-01-08 14:31:22
举报
文章被收录于专栏:everhad

泛型和通配符

使用泛型和通配符都可以让一个方法所表示的算法逻辑适应多种类型。 Java中具备继承关系的类A、B(A extends B)它们的集合List<A>List<B>之间是没有继承关系的, 可以使用泛型或通配符来让一个方法支持同时接受List<A>List<B>

代码场景

这里分别定义类Animal、Dog和Cat,很显然,Dog和Cat是Animal的子类。 它们的简单定义如下:

代码语言:javascript
复制
abstract class Animal {
  public abstract boolean afraidOf(Animal other);
}

class Cat extends Animal {

  @Override
  public boolean afraidOf(Animal other) {
      if (other instanceof Dog) {
        return true;
      }
      return false;
  }
}

class Dog extends Animal {

  @Override
  public boolean afraidOf(Animal other) {
      if (other instanceof Cat) {
        return false;
      }
      return true;
  }
}

上面Animal类定义了boolean afraidOf(Animal other)方法,表示一个动物是否害怕另一个动物。

可以看到Cat和Dog有着不同的表现。

假设有下面需求: 从一个List<Animal>中找到某个Animal对象害怕的所有其它动物。 对应有以下的API方法:

代码语言:javascript
复制
public List<Animal> findScaredAnimals(List<Animal> animals, Animal who) {
  //...
}

如果这时有List<Dog>或者List<Cat>这种,也应该是支持的。 可以通过通配符或者泛型方法实现。

通配符实现

使用List<? extends Animal>这样的形参,就可以接收集合项为Animal子类的任意List。

代码语言:javascript
复制
public List<Animal> findScaredAnimals(List<? extends Animal> animals, Animal who) {
  //...
}

这时就可以这样调用了:

代码语言:javascript
复制
List<Dog> dogs;
....
findScaredAnimals(dogs, animal);
...

其他Animal子类的List都是可以的。

泛型方法实现

抛开实际意义,假设需要findScaredAnimals()中,返回值和参数对应的具体Animal子类型是一致的,那么就需要用到泛型了:

代码语言:javascript
复制
public <T extends Animal> List<T> findScaredAnimals(List<T> animals, T who) {
  //...
}

可以看到,泛型类型参数T同时约束了多个地方。 泛型参数也可以是多个的,而且之间存在关系。

小结

以上通过一个不太实际的案例说明了使用泛型和通配符来解决List泛型集合之间的“匹配”问题。这也是它们的主要用途之一。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-06-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 泛型和通配符
  • 代码场景
  • 通配符实现
  • 泛型方法实现
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档