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

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

  •  
  •   TMDlw · 48 天前 · 3318 次点击
    这是一个创建于 48 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    41 回复  |  直到 2019-12-27 15:43:39 +08:00
    avalon0624
        1
    avalon0624   48 天前
    不难
    qiyuey
        2
    qiyuey   48 天前
    不难,不支持协变和逆变比较可惜
    meteor957
        3
    meteor957   48 天前
    <A<B<C<D<E>>>>>
    dosmlp
        4
    dosmlp   48 天前
    不要太容易
    sadfQED2
        5
    sadfQED2   48 天前 via Android
    真香
    Narcissu5
        6
    Narcissu5   48 天前   ♥ 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   48 天前 via Android   ♥ 1
    @Narcissu5 你的代码为什么骂人
    wsxyeah
        8
    wsxyeah   48 天前 via iPhone
    可以读下 Core Java 卷一
    voidmnwzp
        9
    voidmnwzp   48 天前
    反正又不是真泛型,稍微会用就行了
    joyhub2140
        10
    joyhub2140   48 天前
    不难,泛型表面很优雅,但是底层很丑陋。
    kaedea
        11
    kaedea   48 天前 via Android
    泛型不难,泛型变型难上天
    lhx2008
        12
    lhx2008   48 天前 via Android
    泛型通配还是挺难的,说容易的看一下 stream 的几个 oprator 的函数的参数吧,一眼看懂算我输
    lhx2008
        13
    lhx2008   48 天前 via Android   ♥ 1
    不过相比 c++的模板,还是大巫见小巫
    luckylo
        14
    luckylo   48 天前 via Android
    @lhx2008 至今懵逼的。用的函数基本都是看注释里的示例代码。还有就是 宇宙第二 IDE
    fewok
        15
    fewok   48 天前
    用别人设计的类库不难,难在自己设计
    lotosbin
        16
    lotosbin   48 天前 via iPhone
    java 有范型?
    lululau
        17
    lululau   48 天前 via iPhone
    呵呵,范型要是不难,那 Java 就没有什么难的地方了
    coer
        18
    coer   48 天前 via iPad
    那是你还没了解过 c++的模版
    jaylee4869
        19
    jaylee4869   48 天前
    今天写的:

    Map<String, Map<String, Map<String, String>>> res = list.stream()...;
    wysnylc
        20
    wysnylc   48 天前
    能百度出的都不难,学就完事
    oaix
        21
    oaix   48 天前
    @qiyuey #2 <? extend Base>,<? super Derived> 算啥:-P
    mazyi
        22
    mazyi   48 天前
    你应该没有见过 C 的指针
    qiyuey
        23
    qiyuey   48 天前
    @oaix 是我不严谨了,Java 只在一定程度上支持
    yuankui
        24
    yuankui   48 天前
    ```
    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   48 天前
    难。平时用简单,但是要实现复杂点的东西就麻烦了。
    譬如 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   48 天前 via Android
    相对比较艰难
    salamanderMH
        27
    salamanderMH   48 天前
    总比 C++好多了
    Uchiha0bito
        28
    Uchiha0bito   48 天前
    不懂先跳过 后面会好的 忽然开朗的那种
    llillill
        29
    llillill   48 天前
    不难 对比 C++的一堆奇奇怪怪的符号看着都头晕
    tyrantZhao
        30
    tyrantZhao   47 天前 via Android
    你肯定没用过 cpp 模板元
    gowa
        31
    gowa   47 天前 via Android   ♥ 1
    楼主题目问的是泛型难不难 各位咂就喜欢拿其他语言说事呢。

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

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

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

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

    拿一个实例来看才比较贴切
    huijiewei
        32
    huijiewei   47 天前
    感觉没 C#的好用
    abbycin
        33
    abbycin   47 天前 via Android
    cpp 的 template meta programming 了解一下
    waterlaw
        34
    waterlaw   46 天前 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   46 天前 via Android
    第一个 put 应该是 map.put(o, "js")
    hrong
        36
    hrong   46 天前 via iPhone
    @lhx2008 operator 的参数已经很易懂了 。。。
    hrong
        37
    hrong   46 天前 via iPhone
    @waterlaw 是为了字节码向下兼容 dot net 做不到
    xfriday
        38
    xfriday   46 天前
    就是类型参数化,难个锤子
    chengyiqun
        39
    chengyiqun   46 天前
    java 只是因为要向下兼容, 所以泛型是假泛型. 运行时会类型擦除, 但是用 map 接收数据库反馈的时候, 倒是会报错类型强制转换异常.
    vipcc
        40
    vipcc   46 天前 via Android
    会者不难,难者不会
    g76
        41
    g76   27 天前
    跟 C++ 的比起来,java 的泛型就是个小玩具,食之无味弃之可惜
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1662 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    ♥ Do have faith in what you're doing.