ex1gtnim7d
V2EX  ›  Java

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

  •  1
     
  •   ex1gtnim7d · Jul 20, 2018 · 5325 views
    This topic created in 2884 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

    }

    }
    ```
    这样我就能看懂了, 我是 C#
    FunnyCodingXu
        20
    FunnyCodingXu  
       Jul 20, 2018
    最基础的泛型。。。好好看书学基础吧
    Athrob
        21
    Athrob  
       Jul 20, 2018
    回复不支持`markdown`吗
    hsuan
        22
    hsuan  
       Jul 20, 2018
    泛型方法,楼主应该再好好学学 java。
    sagaxu
        23
    sagaxu  
       Jul 20, 2018 via Android
    这都不熟,是 php 转 java 的吗?
    Lonely
        24
    Lonely  
       Jul 20, 2018 via iPhone
    人才…………………………………………
    deadEgg
        25
    deadEgg  
       Jul 20, 2018
    public <R> ArrayList<R> map(R func){}

    这样写楼主是不是就是秒懂了。
    xhinliang
        26
    xhinliang  
       Jul 20, 2018
    这就是泛型啊
    KuroNekoFan
        27
    KuroNekoFan  
       Jul 20, 2018 via iPhone
    generic type 啊
    ntdll
        28
    ntdll  
       Jul 20, 2018   ❤️ 2
    public <R> R get(R a)

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

    public String get(String a)

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

    用了 kotlin 更爽,这种 lambda 都不需要写个 interface 来定义了
    ex1gtnim7d
        35
    ex1gtnim7d  
    OP
       Jul 20, 2018
    @gam2046 一直看得懂,换成 public R get(R a)我更看得懂,我只是不明白为什么要在 R 前面多加一个<R>,就是过来问问这是什么语法...,因为现在网上随便搜个 Java 泛型的介绍文章一般都只讲类上的泛型和参数上的泛型,有哪篇讲到这种情况的
    ntdll
        36
    ntdll  
       Jul 20, 2018   ❤️ 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 五个泛型参数。
    ex1gtnim7d
        37
    ex1gtnim7d  
    OP
       Jul 20, 2018
    @gam2046 万分感谢!
    don2012
        38
    don2012  
       Jul 20, 2018 via Android
    基础不行啊楼主
    kaedea
        39
    kaedea  
       Jul 20, 2018 via Android
    实例泛型方法,比较能理解,因为涉及到继承,还需要考虑到协变和异变的问题...
    kaedea
        40
    kaedea  
       Jul 20, 2018 via Android
    把类型参数换成 Object,然后用个静态泛型方法保护一下比较好
    JohnZorn
        41
    JohnZorn  
       Jul 22, 2018
    但是实例方法的话 不必声明持有泛型吧 似乎静态才需要声明为返回方法 或者说标记持有此泛型
    Trumeet
        42
    Trumeet  
       Jul 25, 2018 via Android
    泛型了解一下?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1152 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 177ms · UTC 23:38 · PVG 07:38 · LAX 16:38 · JFK 19:38
    ♥ Do have faith in what you're doing.