各位大佬,你们觉得 Java 的泛型难吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TMDlw
V2EX    Java

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

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

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

    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
    反正又不是真泛型,稍微会用就行了
    nxforce
        10
    nxforce  
       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++的模版
    lavvrence
        19
    lavvrence  
       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  
    PRO
       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++的一堆奇奇怪怪的符号看着都头晕
    geminikingfall
        30
    geminikingfall  
       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
    就是类型参数化,难个锤子
    C02TobNClov1Dz56
        39
    C02TobNClov1Dz56  
       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     Solana     2613 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 06:18 PVG 14:18 LAX 23:18 JFK 02:18
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86