1 泛型分类
泛型可以分成泛型类、泛型方法和泛型接口
1.1 泛型类
一个泛型类(generic class)就是具有一个或多个类型变量的类。定义一个泛型类十分简单,只需要在类名后面加上<>,再在里面加上类型参数:
//泛型类
public class MyDemo<T>{
private T value;
public MyDemo(T value){
this.value = value;
}
public T getValue(){
return value;
}
public void setValue(T value){
this.value = value;
}
}
//泛型类使用
public static void main(String[] args) throws ClassNotFoundException{
MyDemo<String> demo = new MyDemo("Hello");
String str = demo.getValue();
System.out.println(str);
demo.setValue("hi");
str = demo.getValue();
System.out.println(str);
}
1.2 泛型方法
泛型方法表达方式如下:
[权限修饰词] <T1,T2,...,Tn> methods(/*...*/) {/*...*/}
尖括号内表示类型参数列表,即方法变量的类型
/**
*android studio的test包下
*/
public class TestDemo {
@Test
public void should_return_value_when_get_with_params(){
String str = get("Hello","world");
Assert.assertEquals("the str should be equals to Hello","Hello",str);
int num = get(123,"Hello");
Assert.assertEquals("num should be equals to 123","123",num);
}
public static <T, U> T get(T t, U u) {
if (u != null)
return t;
else
return null;
}
}
1.3 泛型接口
interface Show<T,U>{
void show(T t,U u);
}
class ShowTest implements Show<String,Date>{
@Override
public void show(String str,Date date) {
System.out.println(str);
System.out.println(date);
}
}
2 通配符
通配符表示为:?
- T、K、V、E等泛型字母称为有“有类型”,类型具体使用时而定。
- ?为未知类型,类型参数不确定,可以是任意类型。只能用在声明类型、方法参数上,不能用在定义泛型类上
package generic;
import java.util.ArrayList;
import java.util.List;
/**
* ? -->通配符,类型不确定,用于声明 变量|形参 上
* 不能用在:
* 1,创建对象
* 2,创建泛型类 、泛型方法、泛型接口上
*
*/
public class WildcardTest {
public static void main(String[] args) {
//声明
List<?> list = new ArrayList<Integer>();
list = new ArrayList<String>();
list = new ArrayList<Object>();
test(list);
//编译错误,不能创建对象
// list = new ArrayList<?>();
}
public static void test (List<?> list){
}
//?不能用在泛型方法上
/*public static <?> void test2(List<?> list){
}*/
//?不能创建泛型类
/*class Test<?>{
}*/
}
3 泛型嵌套
泛型嵌套很常见,如:
List<Map<String,Integer>> list;
//HashMap
Map<String,String> map = new HashMap<String,String>();
map.put("a", "老大");
map.put("b", "老二");
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() +"--->"+ entry.getValue());
}
网友评论