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

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

  •  1
     
  •   kerb15 · 2018-07-20 11:37:05 +08:00 · 4433 次点击
    这是一个创建于 2104 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    42 条回复    2018-07-25 20:17:08 +08:00
    kerb15
        1
    kerb15  
    OP
       2018-07-20 11:39:44 +08:00
    没见过的可以顶一下,看下有多少人跟我一样⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
    Cbdy
        2
    Cbdy  
       2018-07-20 11:45:00 +08:00 via Android
    Java 泛型了解一下
    PhxNirvana
        3
    PhxNirvana  
       2018-07-20 11:46:34 +08:00
    这不就是泛型么。。。
    oracle128g
        4
    oracle128g  
       2018-07-20 11:51:04 +08:00 via iPhone   ❤️ 1
    方法返回值前面的泛型代表是方法自定义的类型,跟类上的泛型无关。大概意思就是不使用类上定义的泛型。不对的有请楼下补充
    qiyuey
        5
    qiyuey  
       2018-07-20 11:53:25 +08:00
    这就是个泛型。。。
    zhouyou457
        6
    zhouyou457  
       2018-07-20 11:56:53 +08:00
    public static <T> T getBean(Class<T> clazz) {
    return getApplicationContext().getBean(clazz);
    }

    泛型这种写法太常见了...
    SmallZheng
        7
    SmallZheng  
       2018-07-20 12:00:58 +08:00 via Android
    就是泛型呀,AsyncJob<R> 是返回值
    lhx2008
        8
    lhx2008  
       2018-07-20 12:02:57 +08:00 via Android
    可能是没有空格? R 是从输入参数捕捉的
    kerb15
        9
    kerb15  
    OP
       2018-07-20 12:02:59 +08:00
    @oracle128g 就是说最前面的<R>可以看作是一种声明吗
    cuzfinal
        10
    cuzfinal  
       2018-07-20 12:10:19 +08:00   ❤️ 2
    你是没看过 C++的模板。
    feiyuanqiu
        11
    feiyuanqiu  
       2018-07-20 12:13:49 +08:00 via Android
    你同事有点水啊…第一个 R 是泛型方法的类型参数

    https://docs.oracle.com/javase/tutorial/extra/generics/methods.html
    coffeSlider
        12
    coffeSlider  
       2018-07-20 12:16:52 +08:00 via Android   ❤️ 1
    这也太水了吧
    kansimeng
        13
    kansimeng  
       2018-07-20 12:24:36 +08:00   ❤️ 1
    基础都没打还研究什么 Rxjava?
    theohateonion
        14
    theohateonion  
       2018-07-20 12:29:16 +08:00
    .....我一个前端都知道这是泛型
    easylee
        15
    easylee  
       2018-07-20 12:30:59 +08:00 via Android
    我也觉着是泛型,如果不是的话,请 at 我回来看看。
    kerb15
        16
    kerb15  
    OP
       2018-07-20 12:31:46 +08:00 via Android
    @kansimeng 现在研究不行?
    kerb15
        17
    kerb15  
    OP
       2018-07-20 12:32:55 +08:00 via Android
    @feiyuanqiu thanks
    metrxqin
        18
    metrxqin  
       2018-07-20 12:32:59 +08:00
    你们也是医药专业转 Java 的吗?
    Athrob
        19
    Athrob  
       2018-07-20 12:42:14 +08:00
    ```
    public abstract class AsyncJob<T> {

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

    }

    }
    ```
    这样我就能看懂了, 我是 C#
    FunnyCodingXu
        20
    FunnyCodingXu  
       2018-07-20 12:42:41 +08:00
    最基础的泛型。。。好好看书学基础吧
    Athrob
        21
    Athrob  
       2018-07-20 12:43:12 +08:00
    回复不支持`markdown`吗
    hsuan
        22
    hsuan  
       2018-07-20 12:45:40 +08:00
    泛型方法,楼主应该再好好学学 java。
    sagaxu
        23
    sagaxu  
       2018-07-20 12:48:59 +08:00 via Android
    这都不熟,是 php 转 java 的吗?
    Lonely
        24
    Lonely  
       2018-07-20 13:03:27 +08:00 via iPhone
    人才…………………………………………
    deadEgg
        25
    deadEgg  
       2018-07-20 13:06:35 +08:00
    public <R> ArrayList<R> map(R func){}

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

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

    public String get(String a)

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

    用了 kotlin 更爽,这种 lambda 都不需要写个 interface 来定义了
    kerb15
        35
    kerb15  
    OP
       2018-07-20 14:41:44 +08:00
    @gam2046 一直看得懂,换成 public R get(R a)我更看得懂,我只是不明白为什么要在 R 前面多加一个<R>,就是过来问问这是什么语法...,因为现在网上随便搜个 Java 泛型的介绍文章一般都只讲类上的泛型和参数上的泛型,有哪篇讲到这种情况的
    gam2046
        36
    gam2046  
       2018-07-20 14:49:28 +08:00   ❤️ 4
    语法需要呀。告诉编译器 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
        37
    kerb15  
    OP
       2018-07-20 14:51:50 +08:00
    @gam2046 万分感谢!
    don2012
        38
    don2012  
       2018-07-20 16:46:45 +08:00 via Android
    基础不行啊楼主
    kaedea
        39
    kaedea  
       2018-07-20 18:06:37 +08:00 via Android
    实例泛型方法,比较能理解,因为涉及到继承,还需要考虑到协变和异变的问题...
    kaedea
        40
    kaedea  
       2018-07-20 18:07:32 +08:00 via Android
    把类型参数换成 Object,然后用个静态泛型方法保护一下比较好
    choice4
        41
    choice4  
       2018-07-22 20:16:24 +08:00
    但是实例方法的话 不必声明持有泛型吧 似乎静态才需要声明为返回方法 或者说标记持有此泛型
    Trumeet
        42
    Trumeet  
       2018-07-25 20:17:08 +08:00 via Android
    泛型了解一下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3301 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:48 · PVG 21:48 · LAX 06:48 · JFK 09:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.