V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TMDlw
V2EX  ›  Java

各位大佬,你们觉得 Java 的泛型难吗?

  •  
  •   TMDlw · 2019-12-06 17:21:57 +08:00 · 6401 次点击
    这是一个创建于 1596 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基础比较差,看的有点懵逼

    41 条回复    2019-12-27 15:43:39 +08:00
    avalon0624
        1
    avalon0624  
       2019-12-06 17:33:50 +08:00
    不难
    qiyuey
        2
    qiyuey  
       2019-12-06 17:39:19 +08:00
    不难,不支持协变和逆变比较可惜
    meteor957
        3
    meteor957  
       2019-12-06 17:41:47 +08:00
    <A<B<C<D<E>>>>>
    dosmlp
        4
    dosmlp  
       2019-12-06 17:42:37 +08:00
    不要太容易
    sadfQED2
        5
    sadfQED2  
       2019-12-06 17:43:08 +08:00 via Android
    真香
    Narcissu5
        6
    Narcissu5  
       2019-12-06 17:46:12 +08:00   ❤️ 1
    ```scala
    class ApplicativeOps[M[_],A](ma:M[A])(implicit a:Applicative[M]){

    def ~>[B](mb: M[B]):M[B] = a(a(a.pure((_:A) => (b:B) => b), ma),mb)
    def andKeep[B](mb: M[B]):M[B] = ~>(mb)

    def <~[B](mb: M[B]):M[A] = a(a(a.pure((a:A) => (_:B) => a), ma),mb)
    def keepAnd[B](mb: M[B]):M[A] = <~(mb)

    def <~>[B,C](mb: M[B])(implicit witness: <:<[A,B => C]): M[C] = apply(mb)
    def apply[B,C](mb: M[B])(implicit witness: <:<[A,B => C]): M[C] = a(a.map(ma,witness),mb)
    }
    ```

    贴段 play2 的 scala 代码感受下
    zhaodazzle
        7
    zhaodazzle  
       2019-12-06 17:52:38 +08:00 via Android   ❤️ 1
    @Narcissu5 你的代码为什么骂人
    wsxyeah
        8
    wsxyeah  
       2019-12-06 18:19:51 +08:00 via iPhone
    可以读下 Core Java 卷一
    voidmnwzp
        9
    voidmnwzp  
       2019-12-06 18:38:30 +08:00
    反正又不是真泛型,稍微会用就行了
    joyhub2140
        10
    joyhub2140  
       2019-12-06 18:39:55 +08:00
    不难,泛型表面很优雅,但是底层很丑陋。
    kaedea
        11
    kaedea  
       2019-12-06 18:42:08 +08:00 via Android
    泛型不难,泛型变型难上天
    lhx2008
        12
    lhx2008  
       2019-12-06 18:52:52 +08:00 via Android
    泛型通配还是挺难的,说容易的看一下 stream 的几个 oprator 的函数的参数吧,一眼看懂算我输
    lhx2008
        13
    lhx2008  
       2019-12-06 18:56:53 +08:00 via Android   ❤️ 1
    不过相比 c++的模板,还是大巫见小巫
    luckylo
        14
    luckylo  
       2019-12-06 18:58:17 +08:00 via Android
    @lhx2008 至今懵逼的。用的函数基本都是看注释里的示例代码。还有就是 宇宙第二 IDE
    fewok
        15
    fewok  
       2019-12-06 18:59:54 +08:00
    用别人设计的类库不难,难在自己设计
    lotosbin
        16
    lotosbin  
       2019-12-06 19:02:26 +08:00 via iPhone
    java 有范型?
    lululau
        17
    lululau  
       2019-12-06 19:06:08 +08:00 via iPhone
    呵呵,范型要是不难,那 Java 就没有什么难的地方了
    coer
        18
    coer  
       2019-12-06 19:06:59 +08:00 via iPad
    那是你还没了解过 c++的模版
    jaylee4869
        19
    jaylee4869  
       2019-12-06 19:21:14 +08:00
    今天写的:

    Map<String, Map<String, Map<String, String>>> res = list.stream()...;
    wysnylc
        20
    wysnylc  
       2019-12-06 19:29:31 +08:00
    能百度出的都不难,学就完事
    oaix
        21
    oaix  
       2019-12-06 20:40:04 +08:00
    @qiyuey #2 <? extend Base>,<? super Derived> 算啥:-P
    mazyi
        22
    mazyi  
       2019-12-06 21:03:50 +08:00
    你应该没有见过 C 的指针
    qiyuey
        23
    qiyuey  
       2019-12-06 21:07:56 +08:00
    @oaix 是我不严谨了,Java 只在一定程度上支持
    yuankui
        24
    yuankui  
       2019-12-06 21:14:34 +08:00
    ```
    export type ResolveArrayThunks<TDispatchProps extends ReadonlyArray<any>> =
    TDispatchProps extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, infer A8, infer A9]
    ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>, HandleThunkActionCreator<A4>,
    HandleThunkActionCreator<A5>, HandleThunkActionCreator<A6>, HandleThunkActionCreator<A7>, HandleThunkActionCreator<A8>, HandleThunkActionCreator<A9>]
    : TDispatchProps extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, infer A8]
    ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>, HandleThunkActionCreator<A4>,
    HandleThunkActionCreator<A5>, HandleThunkActionCreator<A6>, HandleThunkActionCreator<A7>, HandleThunkActionCreator<A8>]
    : TDispatchProps extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7]
    ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>, HandleThunkActionCreator<A4>,
    HandleThunkActionCreator<A5>, HandleThunkActionCreator<A6>, HandleThunkActionCreator<A7>]
    : TDispatchProps extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6]
    ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>, HandleThunkActionCreator<A4>, HandleThunkActionCreator<A5>, HandleThunkActionCreator<A6>]
    : TDispatchProps extends [infer A1, infer A2, infer A3, infer A4, infer A5]
    ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>, HandleThunkActionCreator<A4>, HandleThunkActionCreator<A5>]
    : TDispatchProps extends [infer A1, infer A2, infer A3, infer A4] ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>, HandleThunkActionCreator<A4>]
    : TDispatchProps extends [infer A1, infer A2, infer A3] ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>, HandleThunkActionCreator<A3>]
    : TDispatchProps extends [infer A1, infer A2] ? [HandleThunkActionCreator<A1>, HandleThunkActionCreator<A2>]
    : TDispatchProps extends [infer A1] ? [HandleThunkActionCreator<A1>]
    : TDispatchProps extends Array<infer A> ? Array<HandleThunkActionCreator<A>>
    : TDispatchProps extends ReadonlyArray<infer A> ? ReadonlyArray<HandleThunkActionCreator<A>>
    : never
    ;

    ```

    贴一段 typescript ( redux )的,你感受下。。
    aguesuka
        25
    aguesuka  
       2019-12-06 21:30:03 +08:00
    难。平时用简单,但是要实现复杂点的东西就麻烦了。
    譬如 Objects.equals(Function.<List>identity(),Function.<ArrayList>identity()) 结果是 true 还是 false
    再譬如,java.util.stream.BaseStream<T, S extends BaseStream<T, S>>
    再譬如,java.util.stream.Collectors.flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper,
    Collector<? super U, A, R> downstream)
    再譬如,试试把 Stream.flatMap 这个方法加到 BaseStream 里面去。
    Cbdy
        26
    Cbdy  
       2019-12-06 21:33:40 +08:00 via Android
    相对比较艰难
    salamanderMH
        27
    salamanderMH  
       2019-12-06 21:35:45 +08:00
    总比 C++好多了
    Uchiha0bito
        28
    Uchiha0bito  
       2019-12-06 21:44:23 +08:00
    不懂先跳过 后面会好的 忽然开朗的那种
    llillill
        29
    llillill  
       2019-12-06 23:58:01 +08:00
    不难 对比 C++的一堆奇奇怪怪的符号看着都头晕
    tyrantZhao
        30
    tyrantZhao  
       2019-12-07 13:21:56 +08:00 via Android
    你肯定没用过 cpp 模板元
    gowa
        31
    gowa  
       2019-12-07 21:37:08 +08:00 via Android   ❤️ 1
    楼主题目问的是泛型难不难 各位咂就喜欢拿其他语言说事呢。

    泛型这个东西 你就不应该代入具体类的思维去看他。或者你看的时候更应该把泛型参数看成一个具体类去理解这样就没这么难。

    当你自下而上的看别人的泛型代码的时候非常难,因为那是高度抽象的东西。

    你一直先了解整体的一个逻辑架构 设计目的 才能看得通透。

    泛型之所以无比蛋疼,就是因为抽象的过程中给他泛型参数也不做限制。

    拿一个实例来看才比较贴切
    huijiewei
        32
    huijiewei  
       2019-12-07 22:44:39 +08:00
    感觉没 C#的好用
    abbycin
        33
    abbycin  
       2019-12-08 09:19:52 +08:00 via Android
    cpp 的 template meta programming 了解一下
    waterlaw
        34
    waterlaw  
       2019-12-08 10:02:06 +08:00 via Android
    java 的泛型都是假泛型,Map<String, String> map = new Hashmap<>(); Object o = new String("ajax");map.put("ajax", "js"); 查看字节码实际上还是 Map<Object, Object>, 只是 new 的时候保留泛型元数据信息, 实际上运行时执行
    Object o = new String("ajax");map.put (( String ) o,( String )"js"), 泛型在编译时会检查。

    java 的泛型是参数化类型, 假泛型, 在堆中对象还是 Map<Object, Object> , 本质上还是装箱拆箱的应用,c# 的泛型才是真的。
    waterlaw
        35
    waterlaw  
       2019-12-08 10:05:20 +08:00 via Android
    第一个 put 应该是 map.put(o, "js")
    hrong
        36
    hrong  
       2019-12-08 10:27:34 +08:00 via iPhone
    @lhx2008 operator 的参数已经很易懂了 。。。
    hrong
        37
    hrong  
       2019-12-08 10:29:29 +08:00 via iPhone
    @waterlaw 是为了字节码向下兼容 dot net 做不到
    xfriday
        38
    xfriday  
       2019-12-08 14:02:06 +08:00
    就是类型参数化,难个锤子
    chengyiqun
        39
    chengyiqun  
       2019-12-08 18:41:37 +08:00
    java 只是因为要向下兼容, 所以泛型是假泛型. 运行时会类型擦除, 但是用 map 接收数据库反馈的时候, 倒是会报错类型强制转换异常.
    vipcc
        40
    vipcc  
       2019-12-08 19:42:09 +08:00 via Android
    会者不难,难者不会
    g76
        41
    g76  
       2019-12-27 15:43:39 +08:00
    跟 C++ 的比起来,java 的泛型就是个小玩具,食之无味弃之可惜
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   936 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:19 · PVG 06:19 · LAX 15:19 · JFK 18:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.