泛型可以加到类、方法中,作用域不用
1 范型最基本的应用
规定指定容器存放元素的类型,如果不按照事先规定的类型存放,直接会报Compilation error
import java.util.*;
class Snake {
static List<String> s1 = new ArrayList<String>();
}
public class Chips extends Snake {
public static void main(String[] args) {
List c1 = new ArrayList();
s1.add("1"); s1.add("2");
c1.add("3"); c1.add("4");
getStuff(s1, c1);
}
static void getStuff(List<String> a1, List a2) {
for(String s1: a1) System.out.print(s1 + " ");
// Below for-each cannot be compiled; a2 stored Object, cannot be converted to String;
// for(String s2: a2) System.out.print(s2 + " ");
}
}
2 泛型编译与运行
编译时看类型,运行时找对象....泛型编译时,自动擦除,不会报编译错误,只会有警告...
package com.ocjp.generic;
import java.util.*;
public class Salt {
public static void main(String[] args) {
Set s1 = new HashSet();
s1.add(0); // int放到了 Set s1;但是int被当成Object;
s1.add("1"); // String放到了 Set s1;但是String被当成Object;
// 调do2()时,将Object的Set传给了有约束的Set<Number>,编译时,泛型擦除;这样写是可以的。
doStuff(s1);
}
static void doStuff(Set<Number> s) {
do2(s);
Iterator i = s.iterator();
while(i.hasNext()) System.out.print(i.next() + " ");
Object[] oa = s.toArray();
for(int x = 0; x < oa.length; x++)
System.out.print(oa[x] + " ");
System.out.println(s.contains(0)); //true; 只有数字0,contains()本质也是调用的Integer.euqals();
System.out.println(s.contains("0")); //false;
System.out.println(s.contains("1")); //true;只有字符串1,contains()本质也是调用的String.euqals();
}
static void do2(Set s2) { System.out.print(s2.size() + " "); }
}
Output:
2 0 1 0 1 true
false
true
3 通配符