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

2017-01-12 20:45:53 +08:00
 Adia

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

T <T> findValue ();

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

菜鸟一枚,先谢过为敬。

2892 次点击
所在节点    Java
10 条回复
hteen
2017-01-12 20:59:41 +08:00
swift 中有个泛类型,应该是一个意思
Arcus
2017-01-12 21:06:55 +08:00
泛型?
misaka19000
2017-01-12 21:10:12 +08:00
第一个:返回对象的类型;
第二个:泛型
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
2017-01-12 23:11:48 +08:00
没见过这样的写法

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

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

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

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

不过 T 和 <T> 写反了
Cabana
2017-01-13 08:30:09 +08:00
泛型方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334218

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX