zoukankan      html  css  js  c++  java
  • java泛型demo

    1.泛型类

    public class Dog<T> {
        private T age;
    
        public Dog(T age) {
            this.age = age;
        }
    
        public T getAge() {
            return age;
        }
    
        public static void main(String[] args) {
            //Java7之后,尖括号中是不需要填写参数的
            Dog<String> dog=new Dog<>("28");
            System.out.println(dog.getAge());
        }
    }

    普通的类

    public class Dog {
        private Object age;
    
        public Dog(Object age) {
            this.age = age;
        }
    
        public Object getAge() {
            return age;
        }
    
        public static void main(String[] args) {
            Dog dog=new Dog("28");
            System.out.println(dog.getAge());
        }
    }

    这样的代码是完全可以执行了,那为什么还需要泛型类?

    1.安全性

    public class Dog {
        private Object age;
    
        public Dog(Object age) {
            this.age = age;
        }
    
        public Object getAge() {
            return age;
        }
    
        public static void main(String[] args) {
            Dog dog=new Dog("28");
            Integer age=(Integer) dog.getAge();
            System.out.println(age);
        }
    }

    上面的代码编译是完全可以通过的,但是执行的时候就会出现ClassCastException异常
    2.可读性好,省去了反复的强制类型转换。

    对于泛型类,java编译器会将泛型代码转换成普通的非泛型代码,

    所以对于虚拟机来说,是没有泛型类的概念的。
    为什么这么设计呢?应为泛型是jdk6以后才有的,为了向下兼容。

    泛型方法:

    public class TestMethod {
        public static <T> boolean isHas(T[] arr, T elemt){
            for(T t:arr){
                if(t.equals(elemt)){
                    return true;
                }
            }
            return false;
        }
        public <S> boolean isString(S s){
           if(s instanceof String){
               return true;
           }
           return false;
        }
    
        public static void main(String[] args) {
            Integer[] arr={1,5,6,8};
            System.out.println(isHas(arr,8));
            TestMethod testMethod=new TestMethod();
            System.out.println(testMethod.isString(5));
        }
    }

    一个方法是不是泛型和他的类是不是泛型没有任何关系。
    泛型方法需要在方法的返回值前先声明,在从后面的代码中使用。

    泛型接口:
    参照Comparable接口。

    public class TestComparable implements MyComparable<TestComparable>{
    
        private Integer n;
    
        public TestComparable(int n) {
            this.n = n;
        }
    
        @Override
        public boolean isEquals(TestComparable testComparable) {
            return this.n.intValue()==testComparable.getN().intValue()?true:false;
        }
    
        public Integer getN() {
            return n;
        }
    
        public static void main(String[] args) {
            TestComparable testComparable1=new TestComparable(2);
            TestComparable testComparable2=new TestComparable(2);
            System.out.println(testComparable1.isEquals(testComparable2));
        }
    }
    interface MyComparable<T> {
        boolean isEquals(T t);
    }

    类型参数继承某个类

    /**
     * 测试继承class
     */
    public class TestInheritClass<T extends  Father>{
        private T t;
    
        public TestInheritClass(T t) {
            this.t = t;
        }
    
        void output(){
            System.out.println(t.getName());
        }
    
        public static void main(String[] args) {
            Child child=new Child("李逵");
            TestInheritClass<Child> t=new TestInheritClass<>(child);
            t.output();
        }
    }
    class Father{
        private String name;
    
        public String getName() {
            return name;
        }
    
        public Father(String name) {
            this.name = name;
        }
    }
    class Child extends Father{
        public Child(String name) {
            super(name);
        }
    
    }

    测试继承接口

    /**
     * 测试继承接口
     */
    public class TestInheritInterface<T extends IFruits> {
        private T t;
    
        public TestInheritInterface(T t) {
            this.t = t;
        }
        void output(){
            t.shape();
        }
    
        public static void main(String[] args) {
            Apple apple=new Apple();
            TestInheritInterface<Apple> t=new TestInheritInterface<>(apple);
            t.output();
        }
    }
    interface IFruits{
        //形状
        void shape();
    }
    class Apple implements IFruits{
        @Override
        public void shape() {
            System.out.println("苹果是圆形的。");
        }
    }
  • 相关阅读:
    三大家族的作用和区别
    正则表达式
    Math的方法
    数组API方法
    面向对象方法
    数组的常用方法
    对象和数组的遍历方法
    js运算符(运算符的结合性)
    i++和++i的运算符
    flex
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/12127931.html
Copyright © 2011-2022 走看看