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

看到个“奇怪”的写法,想问问怎么理解?

  •  
  •   Adia · 2017 年 1 月 12 日 · 3300 次点击
    这是一个创建于 3298 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到一个接口里的其中一个方法是这么写的:

    T <T> findValue ();
    

    前面一个 T 和后面的一个 T 分别代表着什么意思?问别人告诉我是类型根据调用时决定,并且返回值也是这个类型。是这样吗?感觉有点晕乎。厉害之处好像是解决了大量函数重载的问题?

    菜鸟一枚,先谢过为敬。

    10 条回复    2017-01-13 08:30:09 +08:00
    hteen
        1
    hteen  
       2017 年 1 月 12 日 via iPhone
    swift 中有个泛类型,应该是一个意思
    Arcus
        2
    Arcus  
       2017 年 1 月 12 日
    泛型?
    misaka19000
        3
    misaka19000  
       2017 年 1 月 12 日
    第一个:返回对象的类型;
    第二个:泛型
    plqws
        4
    plqws  
       2017 年 1 月 12 日
    int a
    string b

    a = findValue() 时, findValue 里面就能用 T 获取 a 的类型 int
    b = findValue() 时, findValue 里面就能用 T 获取 b 的类型 string

    好久没碰了,不知道有没有记错。。
    SoloCompany
        5
    SoloCompany  
       2017 年 1 月 12 日
    没见过这样的写法

    一般是
    <T> T method(T input);

    也就是说模板参数必须在前面而不是后面,顺序反了

    其次,一般应该有输入参数和模板参数对应,否则这个方法只能永远返回 null 了,因为方法体里面没法进行类型推断。当然 kotlin 的 reified 关键字可以有这种支持但那不是 java
    Rice
        6
    Rice  
       2017 年 1 月 13 日 via iPhone
    泛型啊
    spice630
        7
    spice630  
       2017 年 1 月 13 日
    灾难。。期待 golang 的解决方案~~
    Cbdy
        8
    Cbdy  
       2017 年 1 月 13 日 via Android
    这是 Java 的泛型吧?因为是编译时泛型,所以有点反直觉,啰嗦。 C++的模板 /C#泛型,就好理解很多。但不管怎么说,泛型是个好东西。
    twoyuan
        9
    twoyuan  
       2017 年 1 月 13 日
    在这个例子貌似只能如题主所说,通过类型推导免去强制类型转换。

    如果这个接口方法通过动态代理实现来调用的话,是可以通过获取返回值类型拿到这个 T 的 type 然后做处理的, Android 里 retrofit 就是这么实现的。

    不过 T 和 <T> 写反了
    Cabana
        10
    Cabana  
       2017 年 1 月 13 日 via Android
    泛型方法
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:47 · PVG 02:47 · LAX 10:47 · JFK 13:47
    ♥ Do have faith in what you're doing.