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

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

  •  
  •   Adia · 2017-01-12 20:45:53 +08:00 · 2873 次点击
    这是一个创建于 2864 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    T <T> findValue ();
    

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

    菜鸟一枚,先谢过为敬。

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

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

    好久没碰了,不知道有没有记错。。
    SoloCompany
        5
    SoloCompany  
       2017-01-12 23:11:48 +08:00
    没见过这样的写法

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

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

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

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

    不过 T 和 <T> 写反了
    Cabana
        10
    Cabana  
       2017-01-13 08:30:09 +08:00 via Android
    泛型方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2684 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:55 · PVG 09:55 · LAX 17:55 · JFK 20:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.