aoscici2000
V2EX  ›  Java

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

  •  
  •   aoscici2000 · Jun 18, 2019 · 6158 views
    This topic created in 2704 days ago, the information mentioned may be changed or developed.

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

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

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

    1 和 2 有什么区别?

    34 replies  •  2019-08-05 16:59:52 +08:00
    CFO
    CFO
    Jun 18, 2019 via Android
    1
    了解下泛型的作用
    krisuari
    krisuari
    Jun 18, 2019
    2
    看业务 如果没有共性,可以写死。
    考虑通用或者底层就不要硬编码
    wenzhoou
    wenzhoou
    Jun 18, 2019 via Android❤️1
    3
    肯定第一种,因为你的 key 是 String 嘛。
    wolfie
    wolfie
    Jun 18, 2019
    4
    不指定类型,迭代时候强转吗。
    Mistwave
    Mistwave
    Jun 18, 2019 via iPhone
    5
    effective java 3rd
    item 26
    请
    wolfie
    wolfie
    Jun 18, 2019
    6
    实际没区别。
    ```
    List<String> l1 = new ArrayList();

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

    System.out.println(l2.get(0) instanceof Integer);
    ```
    wenzhoou
    wenzhoou
    Jun 18, 2019 via Android
    7
    这样写代码的话容易菊花不保啊。
    wc951
    wc951
    Jun 18, 2019 via Android❤️1
    8
    ide 会给出 rawtype 警告,逼死强迫症
    SpiderXiantang
    SpiderXiantang
    Jun 18, 2019
    9
    阅读一下 java 编程思想 以及了解一下向上转型
    aoscici2000
    aoscici2000
    OP
    Jun 18, 2019
    10
    @wenzhoou 为何?
    SabaPing
    SabaPing
    Jun 18, 2019
    11
    首先这样做本质上是为了做到 static type safety + polymorphism , 换句话说在保证一定静态类型安全前提下, 抽出共性, 代码重用.

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

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

    如果一个已完成项目里面本身都指定了泛型信息,这时候把所有泛型全部删掉,和之前运行起来不会有区别(反射炫技除外),只是少了一堆代码提示和多了一堆强制类型转换。
    toconoma
    toconoma
    Jun 18, 2019
    19
    好好地写个类很难吗...
    aoscici2000
    aoscici2000
    OP
    Jun 18, 2019 via iPhone
    20
    @chendy 为什么?接到合格数据就处理,不合格就返回去指明格式要求,好像也没什么毛病的样子?
    chendy
    chendy
    Jun 18, 2019
    21
    @aoscici2000 必须要找到所有的 get 和 put 否则不知道里面有什么
    Raymon111111
    Raymon111111
    Jun 18, 2019
    22
    从代码运行的角度是完全没区别的

    但是还推荐加, 因为可以保证传入的类型, 你也不希望你认为 get 出一个 String 结果是个 int 吧
    ntdll
    ntdll
    Jun 18, 2019
    23
    对于 Java 来说没有任何区别,Java 的泛型是基于类型擦除实现的,本身就是一个伪泛型,只是编译器帮你做了强制类型转换。
    cheng6563
    cheng6563
    Jun 18, 2019 via iPhone
    24
    @chendy map 接 json 有啥问题啊
    zjsxwc
    zjsxwc
    Jun 18, 2019 via Android
    25
    用朴素的解释来说区别就是,
    被调用者 与 调用者 之间的“约定” 不一样,
    如果被调用者完全不关心入参具体类型,例如仅仅只是做数值运算或者缓存等,那么用 Map ;
    如果被调用者对入参具体类型有要求,那么用对应 json 字符串的 Class,别用 Map<String, Object>;


    楼主的 saveone 明显是数据库操作
    zjsxwc
    zjsxwc
    Jun 18, 2019 via Android
    26
    楼主的 saveone 明显是数据库操作,还用 map 不是找骂吗?
    aoscici2000
    aoscici2000
    OP
    Jun 18, 2019 via iPhone
    27
    @zjsxwc 传进来的数据一大堆数组需要计算后才保存,感觉直接用 map 还方便点,确实被骂了一顿...
    luozic
    luozic
    Jun 18, 2019 via iPhone
    28
    JMH 基准测试一下。
    20015jjw
    20015jjw
    Jun 18, 2019 via Android
    29
    学一下基本的东西再写啊..
    aoscici2000
    aoscici2000
    OP
    Jun 18, 2019
    30
    @20015jjw 呃...基础都看了,看完就容易忘了, 难道边写边学不是比较有效的方式嘛
    Takamine
    Takamine
    Jun 18, 2019 via Android
    31
    不如形参类型也都用 Object o 好了。:doge:
    HongJay
    HongJay
    Jun 18, 2019
    32
    @aoscici2000 所以被喷也要坦然接受。
    EminemW
    EminemW
    Jun 19, 2019 via iPhone
    33
    想知道为什么接 json 不直接用 JSONObject
    nnnToTnnn
    nnnToTnnn
    Aug 5, 2019
    34
    没啥区别,最后编译出来的 class 也没有泛型的,其实 Java 对于编译器而已,是没有所谓的泛型,都是强制类型转换过去的

    编写阶段
    public String saveOne(Map<String, Object> data) { ... }

    编译成 class 后
    public String saveOne(Map data) { ... }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2121 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 15:00 · PVG 23:00 · LAX 07:00 · JFK 10:00
    ♥ Do have faith in what you're doing.