java 自动类型推断_Java 泛型 -- 依据声明的变量类型自动推断

Java 泛型在调用方法操作时应用具体参数还是很好理解的,比如

Map map = new HashMap<>(); //钻石操作符是 JDK 1.7 引入的

后续的 put 操作调用的具体方法就是

Integer put(String key, Integer value)

因为  put 方法的原型是

V put(K key, V value)

上面的代码我们是看到了 <>,所以知道是泛型调用。有时候并不需要 <>,但实际上也是进行的泛型调用,那就是 Java  可以依据变量声明类型来作特化调用 -- 应用具体参数类型。

例如:

List list = Collections.emptyList();  //虽不见 <>, 但同样是泛型调用,类型为 String

它调用的方法的实现代码是

public static final List emptyList() {

return (List) EMPTY_LIST;

}

Collections.emptyList() 调用时根据声明的 List 自动具体化类型为 String 来调用。

下面以一张图来呈现不用调用方式时推断出的类型

java_generic_auto_infer.png?resize=600%2C460

依各行代码行简要说明

行 5:    泛型方法中,什么也不知道,只是 T

行 9:    因为方法  foo() 声明的类型是 String, 所以 return abc() 时应用的具体类型就是 String

行 13:  声明的类型  ss 是 Integer, 因而应用 Integer  具体类型

行 16:  没有类型信息所以当作 Object 来处理

行 19:  String 类型是为 abc() 结果值的方法调用的返回值定义的,所以只认为 abc() 得到的是一个 Object

如果不能用声明的类型来指示,还可以通过方法参数来传达类型信息,如

public class Test {

static <T> T abc(Class<T> type) {

return (T) "abc";

}

static <T> T abc(T t) {

return (T) "abc";

}

public static void main(String[] args) {

abc(String.class).toCharArray();

abc("123").toLowerCase();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

publicclassTest{

static<T>Tabc(Class<T>type){

return(T)"abc";

}

static<T>Tabc(Tt){

return(T)"abc";

}

publicstaticvoidmain(String[]args){

abc(String.class).toCharArray();

abc("123").toLowerCase();

}

}

abc(...) 返回值就直接知道是相应的具体类型了。

小结:

三种方式告诉泛型方法具体化的类型

1. 显式的写在 <> 号,如 new ArrayList 或 Test.foo()

2. 声明类型,如 String s = Test.foo()

3. 方法参数, 如 Test.foo(String.class) 或 Test.foo("abc")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值