Java 的泛型能够向 golang 一样, T 可以表示多个类型?

2022-12-25 00:49:47 +08:00
 jeesk
func SumIntsOrFloats[K comparable, V int | float64](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}

比如上面这段代码? v 表示的是两种类型。 但是 java/kotlin 里面好像只有上限和下限。

    fun <T : File> getString(uri: T): T {
        return uri
    }

kotlin 里面的 T ,类型只有一种,感觉是真的不方便? 各位大神,kotlin 或者 java 有没有其他的写法支持多种类型?

4646 次点击
所在节点    程序员
30 条回复
jeesk
2022-12-25 11:10:50 +08:00
@iseki 重载也行, 不过能像 golang 一样能省就好了。
coala
2022-12-25 11:49:45 +08:00
@jeesk 第一次写 node.js 的时候, 当时实现了一个简单 WebSocket Server, node.js 居然只用 1 个文件 20 多行代码就搞定了, Java 干这个事得定义了好几个对象, 几个文件配合干, 代码很容易一大片。 对我来说非常震撼。

Java 现在只在编译时检查一个泛型, 看上去实现检查 2 个泛型也不是什么难事, 兼容旧版这种理由我是不信的, 编译时能检查一个也能检查两个 , 反正是 "假泛型"。 我更倾向于作者就是觉得只允许一个类型更好一点。 像 Python 强制 4 个空格的语法, 咱也不敢骂。

没有泛型好, 还是只有一种类型好, 还是支持多种类型好, 真的有答案吗?
jeesk
2022-12-25 12:03:46 +08:00
@coala java 也能呀, 都写在一个文件里面不是问题。
coala
2022-12-25 12:19:49 +08:00
@iseki 是的, 我也觉得 Golang 更好一点, Java 一般
iseki
2022-12-25 12:24:38 +08:00
@coala 不不不,我觉得 Go 是一个设计的很差的语言,Java 太罗嗦,我选择 Kotlin (洗手)
coala
2022-12-25 12:36:18 +08:00
@iseki 2333, 圈错了, Sorry...
Huelse
2022-12-25 13:51:41 +08:00
可能 Scala3 更符合你的需求,如 Intersection Types, Union Types 等等 https://dotty.epfl.ch/
lisongeee
2022-12-25 13:55:58 +08:00
kotlin 可以通过密封类实现联合类型类似效果,但是不如 typescript 灵活
hhjswf
2022-12-26 14:38:29 +08:00
@coala 你不会是手撸的吧? Java 用现成的轮子基于注解还是可以的
netabare
2022-12-27 08:38:50 +08:00
这个是 sum type ,typescript 里面有不错的支持。kotlin 和 java 都没有,得用 scala ,不然就是纯 fp 的 ocaml 、haskell 之类的语言才有了。

sealed class 模拟的问题在于不能用再已有的类型上,必须手写一层例如 IntWrapper 、StringWrapper 之类的层来套着,对数据互转很不方便。

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

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

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

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

© 2021 V2EX