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

2019-12-06 17:21:57 +08:00
 TMDlw

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

6669 次点击
所在节点    Java
41 条回复
oaix
2019-12-06 20:40:04 +08:00
@qiyuey #2 <? extend Base>,<? super Derived> 算啥:-P
mazyi
2019-12-06 21:03:50 +08:00
你应该没有见过 C 的指针
qiyuey
2019-12-06 21:07:56 +08:00
@oaix 是我不严谨了,Java 只在一定程度上支持
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
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
2019-12-06 21:33:40 +08:00
相对比较艰难
salamanderMH
2019-12-06 21:35:45 +08:00
总比 C++好多了
Uchiha0bito
2019-12-06 21:44:23 +08:00
不懂先跳过 后面会好的 忽然开朗的那种
llillill
2019-12-06 23:58:01 +08:00
不难 对比 C++的一堆奇奇怪怪的符号看着都头晕
tyrantZhao
2019-12-07 13:21:56 +08:00
你肯定没用过 cpp 模板元
gowa
2019-12-07 21:37:08 +08:00
楼主题目问的是泛型难不难 各位咂就喜欢拿其他语言说事呢。

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

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

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

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

拿一个实例来看才比较贴切
huijiewei
2019-12-07 22:44:39 +08:00
感觉没 C#的好用
abbycin
2019-12-08 09:19:52 +08:00
cpp 的 template meta programming 了解一下
waterlaw
2019-12-08 10:02:06 +08:00
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
2019-12-08 10:05:20 +08:00
第一个 put 应该是 map.put(o, "js")
hrong
2019-12-08 10:27:34 +08:00
@lhx2008 operator 的参数已经很易懂了 。。。
hrong
2019-12-08 10:29:29 +08:00
@waterlaw 是为了字节码向下兼容 dot net 做不到
xfriday
2019-12-08 14:02:06 +08:00
就是类型参数化,难个锤子
chengyiqun
2019-12-08 18:41:37 +08:00
java 只是因为要向下兼容, 所以泛型是假泛型. 运行时会类型擦除, 但是用 map 接收数据库反馈的时候, 倒是会报错类型强制转换异常.
vipcc
2019-12-08 19:42:09 +08:00
会者不难,难者不会

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

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

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

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

© 2021 V2EX