为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的泛型转换

Java中的泛型转换

MYYA 2019-02-28 05:14:20
下面泛型方法定义中,会有啥问题吗?主要是 1 和 3 那样强制转换有问题吗?当然 Cat 和 Dog 是 extends 了 Animal 类 <T extends Animal> void operate(List<T> animalList, Class<T> c){ ... if(c.equals(Cat.class)){ List catList = (List<Cat>) animalList; //1 catDao.insert(catList); //2 } if(c.equals(Dog.class)){ List<Dog> dogList = (List<Dog>) animalList; //3 dogDao.insert(dogList); //4 } ... } 其中 insert()函数定义为: catDao.insert(List<Cat> catList); dogDao.insert(List<Dog> dogList);
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

这个转换没什么问题,但总给人一种坏味道的感觉。建议使用工厂模式,这样判断就与操作解耦出来了。

查看完整回答
反对 回复 2019-03-01
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

你看能不能这么写呢?尽管逻辑和你原来的代码有所不同,但可以达到同样的目的。

void operate(List<? extends Animal> animalList) {
    List<Cat> catList = new ArrayList<>();
    List<Cat> dogList = new ArrayList<>();
    for (Animal animal : animalList) {
       if (animal instanceof Cat) {
           catList.add((Cat) animal);
       }
       if (animal instanceof Dog) {
           dogList.add((Dog) animal);
       }
    }
    catDao.insert(catList);
    dogDao.insert(dogList);
}
查看完整回答
反对 回复 2019-03-01
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

并不建议这么做,因为这失去了继承的意义。没有获得继承带来的好处,却要背负维护继承关系的负担。这买卖不划算啊,是不?
可以考虑这么做:

  1. 增加一个AnimalDAO:

    public class AnimalDAO<T extends Animal> {
        public void insert(List<T> animals) {
            System.out.println("Animals have been inserted.");
        }
    }
  2. 调用的客户端:

    public class AnimalClient {
        public static void main(String[] args) {
            List<Cat> cats = Stream.of(new Cat()).collect(Collectors.toList());
            List<Dog> dogs = Stream.of(new Dog()).collect(Collectors.toList());
            
            operate(cats);
            operate(dogs);
        }
        
        public static <T extends Animal> void operate(List<T> animals) {
            AnimalDAO<T> animalDAO = new AnimalDAO<>();
            animalDAO.insert(animals);
        }
    }
    • 编译通过,运行结果:

      Animals have been inserted
      Animals have been inserted
查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 1026 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信