• 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+ "
    ");
    
                System.out.println("2-----------");
                Animal ani1 = creatNew2(Cat.class);
                Cat cat1 = (Cat) ani1;
                System.out.println(cat1.name + " is " + cat1.type + "
    ");
    
                System.out.println("3-----------");
                Object obj = creatNew3(Dog.class);
                Dog dog2 = (Dog) obj;
                System.out.println(dog1.name + " is " + dog2.type + "
    ");
    
                System.out.println("4-----------");
                Object obj2 = creatNew4(Cat.class);
                Cat cat2 = (Cat) obj2;
                System.out.println(cat2.name + " is " + cat2.type + "
    ");
    
                System.out.println("5-----------");
                Object obj3 = creatNew5(new Cat());
                Cat cat3 = (Cat) obj3;
                System.out.println(cat3.name + " is " + cat3.type + "
    ");
            }
    
            /**
             * 此方法是一个非泛型类中的泛型方法,参数为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";
        }
    
    /**
     * 这些方法,传的参数声明不同,其返回的声明也必然要随之不同。
     */
  • 相关阅读:
    使用nodejs运行SAP Fiori应用
    JUnit 注解@Rule的工作原理
    JUnit 注解@SuiteClasses的工作原理
    JUnit 注解@Category的工作原理
    JUnit 注解@RunWith的工作原理
    Eclipse里如果看不到Attach Source按钮应该怎么办
    使用SAP CRM中间件从ERP下载BOM的一些常见问题
    GaussDB(DWS):非侵入式备份及其在NBU上的应用
    华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易
    华为云举办AI经典论文复现活动,打造领先AI开发者学习社区
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9522023.html
Copyright © 2020-2023  润新知