• Java 泛型


    泛型的好处

    • 提高代码的重用性(减少重载)
    • 防止类型转换异常,提高代码的安全性

    泛型类

    注意

    1、泛型只能使用引用类型
    2、不同泛型类型对象之间不能相互赋值

    package com.test;
    class Point<T>//实例化的时候指明T的类型
    {
    	private T x ;
    	private T y ;
    	public T getX() {
    		return x;
    	}
    	public void setX(T x) {
    		this.x = x;
    	}
    	public T getY() {
    		return y;
    	}
    	public void setY(T y) {
    		this.y = y;
    	}
    	@Override
    	public String toString() {
    		return "Point [x=" + x + ", y=" + y + "]";
    	}
    	public Point(T x, T y) {
    		super();
    		this.x = x;
    		this.y = y;
    	}
    	public Point() {}
    }
    public class Test01 
    {
    	public static void main(String[] args) 
    	{
    		Point<Integer> p1 = new Point<>();//jdk1.7后第二个尖括号不需要指明类型
    		p1.setX(2);
    		p1.setY(1);
    		int strx =p1.getX() ;
    		int a =p1.getY();
    		System.out.println(strx+a);
    	}
    }
    

    通配符

    class Message<T>
    {
        private T message ;
    
        public T getMessage() {
            return message;
        }
    
        public void setMessage(T message) {
            this.message = message;
        }
    }
    public class Test01
    {
        public static void main(String[] args)
        {
            Message<Integer> m = new Message<>();
            m.setMessage(100);
            fun(m);
    
            Message<String> m2 = new Message<>();
            m2.setMessage("Hello");
            fun(m2);
        }
        public static void fun(Message<?> m)//由于不知道要传入的类型,所以用通配符
        {
            Object o = m.getMessage();
            System.out.println(o.getClass());
    
        }
    }
    
    class java.lang.Integer
    class java.lang.String
    

    设置泛型的上限

    class Message<T extends Number>
    {
        private T message ;
    
        public T getMessage() {
            return message;
        }
    
        public void setMessage(T message) {
            this.message = message;
        }
    }
    public class Test01
    {
        public static void main(String[] args)
        {
            Message<Integer> m = new Message<>();
            m.setMessage(100);
            fun(m);
    
            Message<String> m2 = new Message<>();//由于String不是Number的子类,这里会报错
            m2.setMessage("Hello");
            fun(m2);
        }
        public static void fun(Message<?> m)//由于不知道要传入的类型,所以用通配符
        {
            Object o = m.getMessage();
            System.out.println(o.getClass());
    
        }
    }
    

    设置泛型的下限

    
    class Message<T>
    {
        private T message ;
    
        public T getMessage() {
            return message;
        }
    
        public void setMessage(T message) {
            this.message = message;
        }
    }
    public class Test01
    {
        public static void main(String[] args)
        {
            Message<String> m = new Message<>();
            m.setMessage("Hello World");
            fun(m);//String不是Integer的父类,会报错
            
            Message<Integer> m2 = new Message<>();
            m2.setMessage(123);
            fun(m2);
        }
        public static void fun(Message<? super Integer> m)//设置泛型的下限
        {
            System.out.println(m.getMessage());
        }
    }
    

    泛型接口

    /**
     * 泛型接口
     * @param <T>
     */
    interface IMessage<T>
    {
        public void print(T t);
    }
    
    /**
     * 实现泛型接口方法一:
     *   实现类上不知名泛型类型,在实例化的时候指明类型
     * @param <T>
     */
    class MessageImp<T> implements IMessage<T>
    {
        @Override
        public void print(T t) {
            System.out.println(t);
        }
    }
    
    /**
     * 实现泛型接口方法二:
     *     在实现类上直接指明泛型类型
     */
    class MessageImp2 implements IMessage<String>
    {
        @Override
        public void print(String s) {
            System.out.println(s);
        }
    }
    
    public class Test01
    {
        public static void main(String[] args)
        {
            IMessage<String> m = new MessageImp<>();
            m.print("Hello World!");
    
            IMessage<String> m2 = new MessageImp2();
            m2.print("我是方式2");
    
        }
    }
    

    泛型方法

    /**
     * 泛型方法
     * 语法:
     *     权限修饰符 <泛型1...> 返回值 方法名(参数列表){
     *         方法体
     *     }
     * 在权限修饰符和返回值之间声明该方法为泛型方法。返回值,参数列表,方法体中可以使用已经声明的泛型
     */
    class Message
    {
        //声明为泛型方法
        public <T> void print(){
            System.out.println("print");
        }
    
        //参数列表,方法体中使用泛型
        public <T> void print2(T t){
            System.out.println("print2-"+t);
        }
    
        //返回值使用泛型
        public <T> T print3(T t){
            return t;
        }
    
        //可以使用多个泛型
        public <T,K> void print4(T t , K k){
            System.out.println(t+","+k);
        }
    }
    
    public class Test01
    {
        public static void main(String[] args)
        {
            Message message = new Message();
            //使用泛型方法
            message.print();
            //有参数的泛型方法
            message.print2("Hello World");
            //有返回值
            Integer integer = message.print3(123);
            System.out.println(integer);
            //有多个泛型
            message.print4("Hello","World");
        }
    }
    
    --------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
  • 相关阅读:
    web服务器12 中间件函数
    web11 路由
    web服务器15 jsonp格式接口
    web服务器14 cors跨域资源共享 报错及解决方案
    小程序弹窗(模态框)遮罩层 弹窗右上角按钮关闭
    数据库1 mysq数据库的安装全套
    MySQL数据库3 的 where语句 and 和 or运算符
    MySQL数据库2 增删改查
    MySQL分组排序取每组第一条
    IDEA频繁闪退解决
  • 原文地址:https://www.cnblogs.com/zjw-blog/p/13634537.html
Copyright © 2020-2023  润新知