声明类型形参<T>
后,这时编译器并不知道T
是什么类型,假设我们需要调用某些类的方法时,编译器会报错.
class Test<T>{
void fn(T t){
System.out.println(t.charAt(0 )); //假设我们指定T是String或String的子类,我们想调用其charAt方法,这时编译器会报错
}
}
这时我们就需要给T
一个上届<T extends String>
,表示T
是String
或String
的子类,这时编译就可以通过了
package com;
class Test<T extends String>{
void fn(T t){
System.out.println(t.charAt(0 ));
}
}
public class App2 {
public static void main(String[] args) {
Test<String> test = new Test();
test.fn("123");
}
}
边界声明有两个用途
1.获得边界类型的方法
2.只有该边界类型或其子类才能被实例化,相当于做了限制
Test<Integer> test = new Test(); //error
没有下界,<T super String>
参考:
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107