A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Без_тебя 中级黑马   /  2014-6-12 23:48  /  969 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型
今天讲的是怎么做一个泛型类
一、在类中
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、方法全部随父类定

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马