泛型参Class、Class<?>、Class<? extends xx>的对比


  • 泛型参数Class、Class<?>、Class<? extends xx>的对比

/**
 * Created by ypyue on 2017/6/19.
 */
public class Main2 {

    public static void main(String[] args) throws InstantiationExceptionIllegalAccessException {
        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(),返回的类型也为固定的 类型。
     传入Dog.class, 函数中的 固定为Dog.class,函数返回的是Dog类型,不需要强制转换为Dog类型
     (当然,函数返回类型也可以是Object类型,但是没必要)
     */
    public static <TcreatNew1(Class<T> clazz) throws IllegalAccessExceptionInstantiationException {
        System.out.println(clazz);//打印具体传入的类型。
        return clazz.newInstance();
    }

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

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

    /**
     * 传入参数Class<?> 和 上一个方法传入 Class 的区别还不是很清楚,其返回只能声明为Object类对象。
     如:Cat.class, 返回的是Object类型的对象,需强制转换为Cat类型的对象。
     */
    public static Object creatNew4(Class<?> clazz) throws IllegalAccessExceptionInstantiationException {
        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";
}

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

输出:

1-----------
class Dog
name = gou is type = animal

2-----------
class Cat
name = mao is type = animal

3-----------
class Dog
name = gou is type = animal

4-----------
class Cat
name = mao is type = animal

5-----------
class Cat
name = mao is type = animal












  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值