System.out.println(anObject):
这行代码调用anObject.toString()方法。可以覆盖该方法来控制输出。
while(line =read.readLine()!=null)
{
String[] tokens=line.split("/");
songList.add(tokens[0])
}
泛型
http://hllvm.group.iteye.com/group/topic/38414
<>符号代表泛型在作用;
运用泛型可以创建类型安全更好的集合,让问题尽可能在编译器被抓到,而不会等到执行期才冒出来。
不给出泛型E时
class AArrayList<e extends Dog> {
}
AArrayList list=new AArrayList()不等于
AArrayList<Object> list=newA ArrayList();
而由于1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2.移除所有的类型参数。
最终等于AArrayList list<Dog>=new AArrayList<DOG>()
List list = new ArrayList<String>()则等于
List list=new ArrayList();
因为虚拟机在new一个对象的时候用的是同一份的ArrayList的模板,不会有ArrayList与ArrayList<String>两份模板。
所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。
编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。
List list=new List<Integer>()
与List list =new List()一样
但是编译器会检查左边的泛型类型与右边的泛型类型是否能匹配(有继承关系),如:
List<Fruit> flist2 = new ArrayList<Apple>();//compile error 即使Apple是Fruit的子类;
List<? extends Fruit> flist2 = new ArrayList<Apple>();//能通过,但filst2的不能ADD元素,受到限制。
public class Erasure{
public void test(List<String> ls){
System.out.println("Sting");
}
public void test(List<Integer> li){
System.out.println("Integer");
}
}
参数类型明明不一样啊,一个List<String>,一个是List<Integer>,但是,偷偷的说,type erasure之后,它就都是List了
System.out.println(anObject):
这行代码调用anObject.toString()方法。可以覆盖该方法来控制输出。
while(line =read.readLine()!=null)
{
String[] tokens=line.split("/");
songList.add(tokens[0])
}