看到一个接口里的其中一个方法是这么写的:
T <T> findValue ();
前面一个 T 和后面的一个 T 分别代表着什么意思?问别人告诉我是类型根据调用时决定,并且返回值也是这个类型。是这样吗?感觉有点晕乎。厉害之处好像是解决了大量函数重载的问题?
菜鸟一枚,先谢过为敬。
1
hteen 2017-01-12 20:59:41 +08:00 via iPhone
swift 中有个泛类型,应该是一个意思
|
2
Arcus 2017-01-12 21:06:55 +08:00
泛型?
|
3
misaka19000 2017-01-12 21:10:12 +08:00
第一个:返回对象的类型;
第二个:泛型 |
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 好久没碰了,不知道有没有记错。。 |
5
SoloCompany 2017-01-12 23:11:48 +08:00
没见过这样的写法
一般是 <T> T method(T input); 也就是说模板参数必须在前面而不是后面,顺序反了 其次,一般应该有输入参数和模板参数对应,否则这个方法只能永远返回 null 了,因为方法体里面没法进行类型推断。当然 kotlin 的 reified 关键字可以有这种支持但那不是 java |
6
Rice 2017-01-13 01:25:01 +08:00 via iPhone
泛型啊
|
7
spice630 2017-01-13 01:46:49 +08:00
灾难。。期待 golang 的解决方案~~
|
8
Cbdy 2017-01-13 07:48:12 +08:00 via Android
这是 Java 的泛型吧?因为是编译时泛型,所以有点反直觉,啰嗦。 C++的模板 /C#泛型,就好理解很多。但不管怎么说,泛型是个好东西。
|
9
twoyuan 2017-01-13 08:27:25 +08:00
在这个例子貌似只能如题主所说,通过类型推导免去强制类型转换。
如果这个接口方法通过动态代理实现来调用的话,是可以通过获取返回值类型拿到这个 T 的 type 然后做处理的, Android 里 retrofit 就是这么实现的。 不过 T 和 <T> 写反了 |
10
Cabana 2017-01-13 08:30:09 +08:00 via Android
泛型方法
|