有多少人熟悉 Java 如下语法: public <R> R get(R a)

2018-07-20 11:37:05 +08:00
 kerb15

最近在研究 Rxjava 中发现使用了这样的写法。

public abstract class AsyncJob<T> {

    public <R>AsyncJob<R> map(Func<T,R> func){
        
    }
    
}

对于 <R>AsyncJob<R> 这种写法感到陌生,问了一圈同事都说不清楚。

一开始以为是泛型相关,然而没有查到相关介绍。

最后在这篇博客看到 [ java 中返回任意类型值]

大概知道了这是一种 [返回任意类型] 的语法,有人熟悉并知道正确的叫法吗?

4619 次点击
所在节点    Java
42 条回复
Athrob
2018-07-20 12:43:12 +08:00
回复不支持`markdown`吗
hsuan
2018-07-20 12:45:40 +08:00
泛型方法,楼主应该再好好学学 java。
sagaxu
2018-07-20 12:48:59 +08:00
这都不熟,是 php 转 java 的吗?
Lonely
2018-07-20 13:03:27 +08:00
人才…………………………………………
deadEgg
2018-07-20 13:06:35 +08:00
public <R> ArrayList<R> map(R func){}

这样写楼主是不是就是秒懂了。
xhinliang
2018-07-20 13:09:01 +08:00
这就是泛型啊
KuroNekoFan
2018-07-20 13:16:39 +08:00
generic type 啊
gam2046
2018-07-20 13:31:17 +08:00
public <R> R get(R a)

把 R 随便替换成一个已经类型,你是不是就看得懂了,比如说 String

public String get(String a)

public 后面紧跟的<R>只是申明了一个泛型的名称而已,语法需要,并没有实际意义。
xiaojunjor
2018-07-20 13:33:33 +08:00
???
骗金币的???
我不写 java 多看得懂。。
notreami
2018-07-20 13:38:40 +08:00
Rxjava 里,我最恶心的是那堆 Func1、Func2、Func3、Func4
ghos
2018-07-20 13:53:02 +08:00
@notreami 双手赞成
pexcn
2018-07-20 13:53:51 +08:00
这算是比较常见的吧...
seaswalker
2018-07-20 14:03:38 +08:00
方法级别的泛型吧
rockyou12
2018-07-20 14:33:53 +08:00
@notreami java 语言就这样,做任意泛型参数数量也只能这样了,反正用 lambda 就可以当他们不存在了……

用了 kotlin 更爽,这种 lambda 都不需要写个 interface 来定义了
kerb15
2018-07-20 14:41:44 +08:00
@gam2046 一直看得懂,换成 public R get(R a)我更看得懂,我只是不明白为什么要在 R 前面多加一个<R>,就是过来问问这是什么语法...,因为现在网上随便搜个 Java 泛型的介绍文章一般都只讲类上的泛型和参数上的泛型,有哪篇讲到这种情况的
gam2046
2018-07-20 14:49:28 +08:00
语法需要呀。告诉编译器 R 是一个泛型参数。

public R get(R a) 直接这样写,R 在上下文中没有定义,就是语法错误了。天知道 R 是什么东西?在 public 后面加上<R>就是告诉编译器,后面的那个 R 是个泛型( object 类型)。讲到这个,真的是,Java 这个基于类型擦除的假泛型,有时候用起来是真的糟心。

扩展一下
public <I,O> O get(I input)

<I,O>就是申明了这个方法里有两个泛型参数,I 和 O

public <A,B,C,D,E> get(B input) 那就是有 A/B/C/D/E 五个泛型参数。
kerb15
2018-07-20 14:51:50 +08:00
@gam2046 万分感谢!
don2012
2018-07-20 16:46:45 +08:00
基础不行啊楼主
kaedea
2018-07-20 18:06:37 +08:00
实例泛型方法,比较能理解,因为涉及到继承,还需要考虑到协变和异变的问题...
kaedea
2018-07-20 18:07:32 +08:00
把类型参数换成 Object,然后用个静态泛型方法保护一下比较好

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

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

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

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

© 2021 V2EX