Java 中的泛型转换

2017-10-20 16:01:20 +08:00
 esolve

下面泛型方法定义中,会有啥问题吗?主要是 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);
2342 次点击
所在节点    问与答
9 条回复
barlin
2017-10-20 17:13:06 +08:00
这么简单的代码不会试一下?
lyog
2017-10-20 17:30:35 +08:00
这代码写的,,dao 里插 list 什么鬼,还有 list 可以直接赋值的?不是用 clone ?还有真的可以对 list 进行强转吗?
esolve
2017-10-20 17:57:17 +08:00
@barlin 试了没问题,但是怕有隐忧啊
esolve
2017-10-20 18:09:04 +08:00
@lyog dao 里插 list 批入库啊
这里 list 干嘛要 clone ?
verrickt
2017-10-20 18:10:32 +08:00
@esolve 没问题的。java 的泛型采用的是类型擦除的方式实现的。编译后的 list<T>会退化为非泛型那个版本,我 java 写的不多,不记得了。So 上翻一翻就能找到。
6IbA2bj5ip3tK49j
2017-10-20 20:58:43 +08:00
可以。
sorra
2017-10-20 21:39:15 +08:00
基本上没问题,类型判断可以考虑 Class.isInstance 方法
ixiaohei
2017-10-21 12:42:10 +08:00
是没问题,但建议用重载,这样用后面维护困难
esolve
2017-10-21 13:24:54 +08:00
@ixiaohei 重载?怎讲?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/399278

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX