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("苹果是圆形的。");
    }
}

 

posted @ 2019-12-31 23:37  思思博士  阅读(576)  评论(0编辑  收藏  举报