关于Properties类:
代码:
package lesson10;
import java.util.*;
import java.io.*;
class Test
{
public static void main(String[] args) throws Exception
{
Properties pro1 = new Properties();//由于Properties继承自Hashtable,所以,里面的键值对每次读取顺序可能不一样。
pro1.setProperty("username","128128001");
pro1.setProperty("password","inklo888");
pro1.setProperty("displayname","你人");
//为了不出现乱码,建议保存为xml,因为可以指定字符集
pro1.storeToXML(new FileOutputStream("m.xml"),"启动配置","gb2312");
System.out.println(pro1);
System.out.println("***************************************");
Properties pro2 = new Properties();
pro2.setProperty("Gender","男");
//与storeToXML()相对应,加载时请用loadFromXML()
pro2.loadFromXML(new FileInputStream("m.xml"));
System.out.println(pro2);
}
}
运行结果:
所保存的xml文件内容:
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>启动配置</comment>
<entry key="password">inklo888</entry>
<entry key="displayname">你人</entry>
<entry key="username">128128001</entry>
</properties>
泛型:
无论实际参数(实参)是哪种类型,其实都是一个Class对象。例如ArrayList<String> r1 = new ArrayList<String>(); ArrayList<Integer> r2 = new ArrayList<Integer>(); r1.getClass()==r2.getClass() 结果是true。
这也说明在静态属性、静态初始化块、静态方法的声明中,不能使用泛型形参:因为此时可能根本不知道是哪种具体类型。
由于在系统中不会生成真正的泛型,所以 类似 c instanceof List<String>是错误的。
泛型不能类型转换。例如test(List<Object> lst); 假若使用List<String> lst = new ArrayList<String>();调用test(lst);将出错。List<Object>与List<String>并不兼容。
如果有一个类Person,很显然,他是Object的子类,也是IPerson(假设存在该接口,Person并实现了她)的子类,但对于泛型而言,则不成立。
例如:List<Person>并不是List<Object>或List<IPerson>的子类。
但通配符?是所有泛型的父类。例如test(List<?> lst)可以接受任何List的泛型类型。
但声明一个通配符引用,指向具体泛型,则该通配符引用不能用于执行包含泛型的操作。例如:List<?> lst = ArrayList<Integer>();lst.add(100);执行add时,出错。
其实,通配符?表示Object,所以,所有通过get返回的元素,否认都是Object。{假设返回类型为泛型}。但添加add时则需指明类型。
package lesson11;
import java.util.*;
class MyList<T>
{
private static T info001;//error:不能在静态属性声明中使用泛型形参
private T info ;
public MyList()
{
}
public MyList(T info)
{
this.info = info;
}
T getInfo()
{
return info;
}
//错误,不能在静态方法声明中使用泛型形参
public static T getType()
{
return info;
}
}
class A extends MyList<T>//Error 接口 抽象类 继承(实现),规则一样。
{
}
class A extends MyList<String>//Ok 接口 抽象类 继承(实现),规则一样。
{
}
class A extends MyList//Ok,默认变成Object类型 接口 抽象类 继承(实现),规则一样。
{
}
class Test
{
public static void main(String[] args)
{
/* MyList hs = new MyList();
hs.add("Java高手");
hs.add("C#战舰");
hs.add("C++期间");
//hs.add(100);
for(int i = 0 ; i < hs.size();i++ )
{
System.out.println((String)hs.get(i));
}
*/
ArrayList<String> al = new ArrayList<String>();//泛型
al.add("a");
//al.add(new Object());
System.out.println(al.get(0));
MyList<String> c0 = new MyList<String>("同志们好");
System.out.println(c0.getInfo());
MyList c1 = new MyList(1008);//若不指定具体类型,则默认为Object
System.out.println(c1.getInfo());
}
}
泛型继承(实现)重写方法时,例如class A extends MyList<String>,public String getInfo()正确;但public Object getInfo()错误。要和声明一致!!