zoukankan      html  css  js  c++  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+ "
    ");
    
                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";
        }
    
    /**
     * 这些方法,传的参数声明不同,其返回的声明也必然要随之不同。
     */
  • 相关阅读:
    hdu 5446 Unknown Treasure lucas和CRT
    Hdu 5444 Elven Postman dfs
    hdu 5443 The Water Problem 线段树
    hdu 5442 Favorite Donut 后缀数组
    hdu 5441 Travel 离线带权并查集
    hdu 5438 Ponds 拓扑排序
    hdu 5437 Alisha’s Party 优先队列
    HDU 5433 Xiao Ming climbing dp
    hdu 5432 Pyramid Split 二分
    Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9522023.html
Copyright © 2011-2022 走看看