Map, List 写死类型和不写有什么区别?

2019-06-18 16:53:32 +08:00
 aoscici2000

比如我传入的数据{"name": "...", "age": 90 ...}

1: public String saveOne(Map<String, Object> data) { ... }

2: public String saveOne(Map data) { ... }

1 和 2 有什么区别?

4881 次点击
所在节点    Java
34 条回复
CFO
2019-06-18 17:03:19 +08:00
了解下泛型的作用
krisuari
2019-06-18 17:07:48 +08:00
看业务 如果没有共性,可以写死。
考虑通用或者底层就不要硬编码
wenzhoou
2019-06-18 17:16:11 +08:00
肯定第一种,因为你的 key 是 String 嘛。
wolfie
2019-06-18 17:17:28 +08:00
不指定类型,迭代时候强转吗。
Mistwave
2019-06-18 17:19:09 +08:00
effective java 3rd
item 26
wolfie
2019-06-18 17:21:43 +08:00
实际没区别。
```
List<String> l1 = new ArrayList();

List l2 = l1;
l2.add(new Integer(1));

System.out.println(l2.get(0) instanceof Integer);
```
wenzhoou
2019-06-18 17:46:14 +08:00
这样写代码的话容易菊花不保啊。
wc951
2019-06-18 18:00:03 +08:00
ide 会给出 rawtype 警告,逼死强迫症
SpiderXiantang
2019-06-18 18:01:49 +08:00
阅读一下 java 编程思想 以及了解一下向上转型
aoscici2000
2019-06-18 18:12:20 +08:00
@wenzhoou 为何?
SabaPing
2019-06-18 18:12:54 +08:00
首先这样做本质上是为了做到 static type safety + polymorphism , 换句话说在保证一定静态类型安全前提下, 抽出共性, 代码重用.

然后 polymorphism 中有一大类叫做 parameter polymorphism, java list 的泛型就是 parameter polymorphism 的一种实现.
wenzhoou
2019-06-18 18:22:24 +08:00
@aoscici2000 我是说 6 楼。这样写没法维护。
NoKey
2019-06-18 18:23:28 +08:00
不看你这帖子,我都不知道居然有第二种写法
kaedea
2019-06-18 18:25:33 +08:00
等价
具体可以了解静态类型安全、泛型、型变
chendy
2019-06-18 18:29:00 +08:00
除非有特殊需求,否则用 Map 接 json 的,见一个打死一个…
u823tg
2019-06-18 18:43:32 +08:00
直接接 json,真的勇士啊你
palmers
2019-06-18 18:43:41 +08:00
区别在于使用者是否能够已知数据类型,如果在 saveOne 方法内部需要把数据取出来做一些业务逻辑,那显然第一种是最优雅的解决方案, 编译期不用强转,数据类型也很明显, 如果 saveOne 内完全不关心数据类型或者处理数据不用关心具体的数据类型 那其实都一样,但是从编码上来说第一种是最好,java 引入泛型目的之一是为了安全 减少 bug

所以总体来说第一种最好
woodensail
2019-06-18 18:47:56 +08:00
对于代码运行实际上是没有区别的,毕竟泛型信息在编译时就被擦除了。
指定泛型的左右实际上是在写代码的时候帮助进行代码分析和提示,以及在编译阶段就把可能出错的地方报出来。

如果一个已完成项目里面本身都指定了泛型信息,这时候把所有泛型全部删掉,和之前运行起来不会有区别(反射炫技除外),只是少了一堆代码提示和多了一堆强制类型转换。
toconoma
2019-06-18 18:50:03 +08:00
好好地写个类很难吗...
aoscici2000
2019-06-18 19:01:50 +08:00
@chendy 为什么?接到合格数据就处理,不合格就返回去指明格式要求,好像也没什么毛病的样子?

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

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

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

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

© 2021 V2EX