Java中泛型的理解

Java中泛型的理解

所谓泛型,是指使程序员定义安全的类型,能够避免强制转换类型时出现的错误不被编译器识别,而运行时却报错。

以下是个人的理解:

在编写Python类或者函数的时候(主要是函数),无需告诉程序返回数据的类型,直接return就行。有很多语言也都是无需声明返回数据的类型的,如PHP,PHP常用于编写接口,然后Java来调用。如果这个接口没有告诉Java接口返回数据的类型的话,Java在编写代码的时候,是不会报错的。举个例子,但如果Java需要的是整型数据,接口却返回了一个浮点型数据,那程序运行就会报错。

这里就体现了泛型的重要性。

泛型的定义

直接上我自己学习写的泛型定义代码

public class Test<T, S> {
    
    
    T over;
    S str;


    public T getOver() {
    
    
        return over;
    }

    public void setOver(T over) {
    
    
        this.over = over;
    }

    public void setStr(S str) {
    
    
        this.str = str;
    }

    public S getStr() {
    
    
        return str;
    }

    public static void main(String[] args) {
    
    
        Test<Boolean, String> b = new Test();
        b.setOver(true);

        boolean b0 = b.getOver();
        System.out.println(b0);

        Test<Boolean, String> s = new Test();
        s.setStr("huangg");
        String str = s.getStr();
        System.out.println(str);
//       int i = b.getOver();
//        Father<Integer, String> f = new Child(1, "2");
//        Child<Integer, String, Boolean> c = new Child(1, false);

    }
}

现在来记录学习体会:

  1. public class Test<T, S> {
        T over;
        S str;
    

    先看这几行代码,在定义类名Test时, 写了<T, S>这个泛型的表达方式,告诉编译器定义的是一个泛型类

    接着,定义了两个泛型的成员变量over和str。如果不好理解的话,可以将这两行代码理解为:

    int over;
    String str;
    

    效果和上面差不多,只是上面的变量不知道是啥类型的。

  2.     public T getOver() {
          
          
            return over;
        }
    
        public void setOver(T over) {
          
          
            this.over = over;
        }
    
        public void setStr(S str) {
          
          
            this.str = str;
        }
    
        public S getStr() {
          
          
            return str;
        }
    
    

    这是在定义set和get方法,注意get方法的时候,要写返回值的类型,分别是T和S,与泛型一致就行了。

  3.     public static void main(String[] args) {
          
          
            Test<Boolean, String> b = new Test();
            b.setOver(true);
    
            boolean b0 = b.getOver();
            System.out.println(b0);
    
            Test<Boolean, String> s = new Test();
            s.setStr("huangg");
            String str = s.getStr();
            System.out.println(str);
    //       int i = b.getOver();
    //        Father<Integer, String> f = new Child(1, "2");
    //        Child<Integer, String, Boolean> c = new Child(1, false);
    
        }
    

    这是主方法,Test<Boolean, String> b = new Test();主方法首先实例化对象,看这里,在实例化对象的时候,就要定义泛型类型了,第一个是布尔值,第二个是字符串,然后将作为布尔值的over值用set方法设置为true,get方法可以取值,下面的第二个变量用同样的方式取值和设置值。

这就是泛型类的定义方法,和常规类差别不大,但是要注意的是,泛型的名字最好不要和已有的类型重名,这样容易出错。泛型可以有一个,也可以有多个。

泛型的其他用法

除了上述使用方法外,还可以

  • 限制泛型的可用类型,如下:

    public class Text <T extends List>{}

    这里的泛型就限定只能是List类型的子类

  • 使用类型通配符?,如public class Text <? extends List>{}

  • 继承泛型类和实现泛型接口。

猜你喜欢

转载自blog.csdn.net/u012848304/article/details/121556480