Java泛型的理解

Java泛型的理解

T  bean ;

Class<T> bean;

Class<?> bean;

单独的T代表一个类型,而Class<T>和Class<?>代表这个类型所对应的类

Class<T>在实例化的时候,T要替换成具体类

Class<?>它是个通配泛型,?可以代表任何类型   

<? extends T>受限统配,表示T的一个未知子类。

<? super T>下限统配,表示T的一个未知父类。

 

package com.advance.genericity;/**
 * Created by hasee on 2018/8/23.
 */

/**
 * @Auther: 谷天乐
 * @Date: 2018/8/23 09:28
 * @Description:
 */
public class Genericity {

        public static void main(String[] args) throws InstantiationException, IllegalAccessException {
            System.out.println("1-----------");
            Dog dog1 = creatNew1(Dog.class);
            System.out.println(dog1.name + " is " + dog1.type+ "\n");

            System.out.println("2-----------");
            Animal ani1 = creatNew2(Cat.class);
            Cat cat1 = (Cat) ani1;
            System.out.println(cat1.name + " is " + cat1.type + "\n");

            System.out.println("3-----------");
            Object obj = creatNew3(Dog.class);
            Dog dog2 = (Dog) obj;
            System.out.println(dog1.name + " is " + dog2.type + "\n");

            System.out.println("4-----------");
            Object obj2 = creatNew4(Cat.class);
            Cat cat2 = (Cat) obj2;
            System.out.println(cat2.name + " is " + cat2.type + "\n");

            System.out.println("5-----------");
            Object obj3 = creatNew5(new Cat());
            Cat cat3 = (Cat) obj3;
            System.out.println(cat3.name + " is " + cat3.type + "\n");
        }

        /**
         * 此方法是一个非泛型类中的泛型方法,参数为Class<T>类型,可以传入任何类,但是Class<T>将参数在函数内部的类型固定为 T类,使用clazz.newInstance(),返回的类型也为固定的 T 类型。
         * 如: 传入Dog.class, 函数中的 T 固定为Dog.class,函数返回的是Dog类型,不需要强制转换为Dog类型
         * (当然,函数返回类型也可以是Object类型,但是没必要)
         */
        public static <T> T creatNew1(Class<T> clazz) throws IllegalAccessException, InstantiationException {
            System.out.println(clazz);//打印具体传入的类型。
            return clazz.newInstance();
        }

        /**
         * 此方法参数是Class<? extends Animal>,只能传入Animal及其子类的类型,函数返回类型只能声明为Animal或Object类型,
         * 如:传入Cat.class,函数返回一个Animal的子类对象,需将此子类对象强制转换为具体的子类(即Cat类)。
         */
        public static Animal creatNew2(Class<? extends Animal> clazz) throws IllegalAccessException, InstantiationException {
            System.out.println(clazz);//打印具体传入的类型。
            return clazz.newInstance();
        }

        /**
         * 此方法参数是Class,可传入任何类,其返回只能声明为Object类对象。
         * 如:传入Dog.class, 返回的是Object类型的对象,需强制转换为Dog类型的对象。
         */
        public static Object creatNew3(Class clazz) throws IllegalAccessException, InstantiationException {
            System.out.println(clazz);//打印具体传入的类型。
            return clazz.newInstance();
        }

        /**
         * 传入参数Class<?> 和 上一个方法传入 Class 的区别还不是很清楚,其返回只能声明为Object类对象。
         * 如:Cat.class, 返回的是Object类型的对象,需强制转换为Cat类型的对象。
         */
        public static Object creatNew4(Class<?> clazz) throws IllegalAccessException, InstantiationException {
            System.out.println(clazz);//打印具体传入的类型。
            return clazz.newInstance();
        }

        /**
         * 传入Object类型的对象,返回也声明为Object类型。
         */
        public static Object creatNew5(Object object) {
            System.out.println(object.getClass());//打印具体传入的类型。
            return object;
        }
    }

    abstract class Animal {
        public String type = "type = animal ";
    }

    class Dog extends Animal {
        public String name = "name = gou";
    }

    class Cat extends Animal {
        public String name = "name = mao";
    }

/**
 * 这些方法,传的参数声明不同,其返回的声明也必然要随之不同。
 */

 

posted @ 2018-08-23 09:56 Rest探路者 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值