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

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

  •  1
     
  •   kerb15 · 145 天前 · 2546 次点击
    这是一个创建于 145 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在研究 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
        1
    kerb15   145 天前
    没见过的可以顶一下,看下有多少人跟我一样⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
        2
    Cbdy   145 天前 via Android
    Java 泛型了解一下
        3
    PhxNirvana   145 天前
    这不就是泛型么。。。
        4
    oracle128g   145 天前 via iPhone   ♥ 1
    方法返回值前面的泛型代表是方法自定义的类型,跟类上的泛型无关。大概意思就是不使用类上定义的泛型。不对的有请楼下补充
        5
    qiyuey   145 天前
    这就是个泛型。。。
        6
    zhouyou457   145 天前
    public static <T> T getBean(Class<T> clazz) {
    return getApplicationContext().getBean(clazz);
    }

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

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

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

    }

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

    这样写楼主是不是就是秒懂了。
        26
    xhinliang   145 天前
    这就是泛型啊
        27
    KuroNekoFan   145 天前 via iPhone
    generic type 啊
        28
    gam2046   145 天前   ♥ 2
    public <R> R get(R a)

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

    public String get(String a)

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

    用了 kotlin 更爽,这种 lambda 都不需要写个 interface 来定义了
        35
    kerb15   145 天前
    @gam2046 一直看得懂,换成 public R get(R a)我更看得懂,我只是不明白为什么要在 R 前面多加一个<R>,就是过来问问这是什么语法...,因为现在网上随便搜个 Java 泛型的介绍文章一般都只讲类上的泛型和参数上的泛型,有哪篇讲到这种情况的
        36
    gam2046   145 天前   ♥ 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 五个泛型参数。
        37
    kerb15   145 天前
    @gam2046 万分感谢!
        38
    don2012   145 天前 via Android
    基础不行啊楼主
        39
    kaedea   145 天前 via Android
    实例泛型方法,比较能理解,因为涉及到继承,还需要考虑到协变和异变的问题...
        40
    kaedea   145 天前 via Android
    把类型参数换成 Object,然后用个静态泛型方法保护一下比较好
        41
    choice4   143 天前
    但是实例方法的话 不必声明持有泛型吧 似乎静态才需要声明为返回方法 或者说标记持有此泛型
        42
    Trumeet   140 天前 via Android
    泛型了解一下?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   917 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 18:47 · PVG 02:47 · LAX 10:47 · JFK 13:47
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1