您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

泛型参数 class 对比

小志的博客 发布时间:2019-02-11 16:32:41 ,浏览量:0

class、 class和Class类型

平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思,今天整理下:

  • ? 表示不确定的java类型。
  • T 表示java类型。
  • K V 分别代表java键值中的Key Value。
  • E 代表Element。 1、 Object跟这些东西代表的java类型有啥区别呢?

Object是所有类的根类,是具体的一个类,使用的时候可能是需要类型强制转换的,但是用T ?等这些的话,在实际用之前类型就已经确定了,不需要强制转换。

追问: 也就是说,这个方法能知道返回的是哪种类型(父类),就用T行了?如果完全不知道的就用?,用T的得到的对象就不需要类型转换了,而用?的就必需用强转了!

第一种是固定的一种泛型,第二种是只要是Object类的子类都可以,换言之,任何类都可以,因为Object是所有类的根基类 固定的泛型指类型是固定的,比如:Interge,String. 就是 这里?代表一个未知的类型,但是,这个未知的类型实际上是Collection的一个子类,Collection是这个通配符的上限.

举例说明:

  • Set 表示 集合里 是 T类的实例
  • List 表示 集合里 是 E类的实例
  • List 表示 集合里的对象类型不确定,未指定
  • List 同 List 是一样的。
1、泛型的作用:

1、用泛型:

List list=new ArrayList();  
T t=list.get(0);  

2、不用泛型:

List  list=new ArrayList();  
T t=(T)list.get(0);
2、举例:

定义一个动物的抽象类

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

定义一个具体的Dog类,继承动物的抽象类

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

定义一个具体的Cat类,继承动物的抽象类

class Cat extends Animal {
    public String name = "name = mao";
}
 /**
     * 此方法是一个非泛型类中的泛型方法,参数为Class类型,可以传入任何类,但是Class将参数在函数内部的类型固定为 T类,使用clazz.newInstance(),返回的类型也为固定的 T 类型。
     * 如: 传入Dog.class, 函数中的 T 固定为Dog.class,函数返回的是Dog类型,不需要强制转换为Dog类型
     * (当然,函数返回类型也可以是Object类型,但是没必要)
     */
public static  T creatNew1(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;
    }

测试类

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");
    }

输出结果

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

参考:https://blog.csdn.net/jitianxia68/article/details/73610606 参考:https://www.cnblogs.com/zhima-hu/p/7352555.html

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0414s