泛型
今天讲的是怎么做一个泛型类
一、在类中
public class Student<T1,T2> {
private T1 name;
private T2 score;
public Student(T1 name, T2 score) {
this.name=name;
this.score=score;
}
public T1 getName() {
return name;
}
public void setName(T1 name) {
this.name = name;
}
public T2 getScore() {
return score;
}
public void setScore(T2 score) {
this.score = score;
}
//测试
public static void main(String args[]){
Student<String, Integer> d = new Student<String, Integer>();//----(1)
}
}
1、注意,在(1)处只能使用引用类型,不能使用基本类型,
2、泛型声明的时候,不能使用静态属性或静态方法,因为泛型是我们在定义的时候确定类型的,而静态则是在编译的时候进行的
二、在接口中
public interface Test<T>{
void test(T a);
}
1、在接口中,泛型只能用在使用的方法中,不能使用在全局常量中(接口中的属性都是默认static final)
三、注意
public class TestMethod{
public static void main(String args[]){
testT(new Student<"aaa",90));
}
public static <T> void testT(T a){
//a.setName("BBB");错误,因为这里的T还未确认是什么类型,不能随便设置
System.out.println(a);
}
}
解决办法:
public class TestMethod{
public static void main(String args[]){
testT(new Student<"aaa",90));
}
public static <T extends Student> void testT(T a){//让T是继承Student类的就行了
a.setName("BBB");
System.out.println(a);
}
}
四、子类继承父类的泛型
public abstract class Father<T1> {
public abstract void test(T1 t);
public static void main(String args[]){
child2<String> o = new child2<String>();
o.test("hello word!");
}
}
class child1 extends Father<String>{
@Override
public void test(String t) {
System.out.println(t);
}
}
class child2<T> extends Father<T>{
@Override
public void test(T t) {
// TODO Auto-generated method stub
System.out.println(t);
}
}
五、擦除,要么同时擦除,要么子类大于父类的类型
/**
* 子类为泛型,父类不为指定类型,泛型擦除,使用Object替换
* **/
class child3<T1,T2> extends Father{
@Override
public void test(Object t) {
// TODO Auto-generated method stub
}
}
/**
* 子类和父类同时擦除,使用Object替换
* **/
class child4 extends Father{
@Override
public void test(Object t) {
// TODO Auto-generated method stub
}
}
六、属性和方法的类型
1、父类中的属性随着父类定,子类中的属性随着子类定
2、方法全部随父类定 |
|