Java基础入门笔记07——泛型类

Java基础入门笔记07——泛型类泛型用来限制集合的存入类型:指定一种。(保证类型安全)Java中的泛型只在编译过程中生效,编译结束就清除相关信息,泛型信息不会进入运行阶段泛型的使用1.泛型类package study1118;public class Test01 { public static void main(String[] args) { //指定泛型为String A<String> a1 = new A<>(); a1.setKe

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

泛型

  • 用来限制集合的存入类型:指定一种——保证类型安全
  • Java中的泛型只在编译过程中生效,编译结束就清除相关信息,泛型信息不会进入运行阶段

泛型的使用

1.泛型类

package study1118;
						A	  T
//泛型类的定义 class 泛型名<类型> { }
//泛型类中所有类型都将会时新建泛型对象时,new的时候指定的那种类型
class A<T>{ 
   
    private T key;
    public void setKey(T key) { 
   
        this.key = key;
    }
    public T getKey(){ 
   
        return this.key;
    };
}

public class Test01 { 
   
    public static void main(String[] args) { 
   
        //新建一个泛型对象,指定泛型为String
        A<String> a1 = new A<>();
        a1.setKey("sadas");
        String s = a1.getKey();
        System.out.println(s);

        //新建一个泛型对象,指定泛型为Integer
        A<Integer> a3 = new A<>();
        a3.setKey(5);
        int i = a3.getKey();
        System.out.println(i);


        //新建一个泛型对象,若不定义泛型则默认泛型为Object
        A a2=new A();
        a2.setKey(new Object());
        Object key = a2.getKey();
        System.out.println(key);


        //同样的泛型类,在new对象时候,泛型指定不同的数据类型生成的泛型对象之间不能互相赋值
        //但进行赋值的类如果有泛型为Object的类则可以,涉及到自动转换类型
        
        a1=a3;//编译报错
        a3=a1;//编译报错
        a3=a2;//通过
    }
}

2.泛型接口

package study1118;

//泛型接口的定义
interface IB<T>{ 
   
    T test(T t);
    //接口中的方法默认都是抽象方法(没有方法体)
    //需要在实现类中进行重写
}

//实现接口IB的抽象方法时,如果未传入实参(此处的实参是某一种泛型),默认泛型为定义接口时所指定的类型
class B1<T> implements IB<T>{ 
   
    @Override
    public T test(T t) { 
   
        return t;
    }
}
//实现接口IB的抽象方法时,如果传入了指定泛型类型,则这个类实现接口的所有方法的参数都将指定为该泛型类型
class B2 implements IB<String>{ 
   
    @Override//重写方法的快捷键ctrl+O
    public String test(String s) { 
   
        return null;
    }
}

public class Test02 { 
   
    public static void main(String[] args) { 
   
//B1类和B2类用法上的区别

//新建B1类对象时候,需要指定泛型类型,若不指定会默认为Object类型,因为定义B1类时没有限制泛型,可以任意
    B1 objectB1 = new B1<Integer>();
    
//新建B2类对象时候,不需要指定泛型类型,因为定义B2类时已经限制了泛型(此处为String)
    B2 b2 = new B2();
    }
}

3.泛型方法

class C1{ 
   
// 定义泛型方法(无返回值的方法)
    public<T> void test(T s){ 
   
        T st = s ;
        
    }
// 定义泛型方法(有返回值,返回类型为T的方法) 
    public<T> T test1(T s){ 
   
        return s;
    }
    
    //有可变参数的方法
    public void test2(String... strs){ 
   
        for (String str : strs) { 
   
            System.out.println(str);
        }
    }
    //有可变参数的泛型方法
    public<T> void test3(T... strs){ 
   
        for (T str : strs) { 
   
            System.out.println(str);
        }
    }
}

泛型静态方法

class C2<E>{ 
   
    private E e;
    //在类上定义的泛型,可以在普通的方法中使用
    public <T> void test(T s){ 
   
        System.out.println(this.e);
    }
    //在类上定义的泛型,无法在静态方法中使用
    public static void test1(){ 
   
// System.out.println(this.e);//编译报错——因为无法从静态上下文中引用非静态 变量 this
    }
    
    // 静态方法如果要使用泛型,应该在定义静态方法时同时指明泛型
	public static<T> void test2(T t){ 
   
        System.out.println(t);

}

使用泛型方法的好处——动态数据类型

public class Test02 { 
   
    public static void main(String[] args) { 
   
        C2<Object> c = new C2<>();
        //泛型方法可以根据传入的参数数据类型来确定返回类型,意思就是数据类型是动态的,在调用方法时才会确定
        String s=c.test("xxx"); 
        Integer i=c.test(1);
        Boolean b=c.test(true);
        
    }
}

通配符——在不确定集合中的元素数据类型时,可以使用“?”来表示所有类型

package study1118;
import java.util.ArrayList;
import java.util.List;

class Dd{ 
   
    public void meth(List<?> list){ 
    }
    //假设有一个方法meth(),需要一个list集合的参数,但是目前不确定list中存的数据到底是什么类型,所以可以用"?"表示任意泛型
   

public class Test03 { 
   
    public static void main(String[] args) { 
   
        Dd dd = new Dd();
    
    //新建一个list集合,往里面丢两个字符串对象
    List<String> l1 = new ArrayList<>();
    l1.add("asas");
    l1.add("qqqq");
    dd.meth(l1);//此时meth方法就接收到了一个装有String数据类型的集合l1

	//新建一个list集合,往里面丢两个数字类型的对象
    List<Integer> l2 = new ArrayList<>();
    l2.add(50);
    l2.add(3);
    dd.meth(l2);//此时meth方法就接收到了一个装有Integer数据类型的集合l2 
   		 }
	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168484.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ThinkPHP运算符 与 SQL运算符 对比表[通俗易懂]

    ThinkPHP运算符 与 SQL运算符 对比表

    2022年1月23日
    45
  • Eclipse使用之导入Maven项目详解[通俗易懂]

    Eclipse使用之导入Maven项目详解[通俗易懂]通俗的来说,Maven就是个类似于git的项目管理工具。而SpringMVC就是将M(Model)、V(View)、C(Controller)三者进行分离进行处理,更有利于开发的进行。下面我将介绍一个别人已经编译好的Maven项目扔给你应该怎样导入到集成开发环境中。开发环境:EclipseStep1:在Eclipse中,选择File->Import;接着如下图所示:点击Browse,选择

    2022年5月29日
    26
  • Python之字典添加元素

    Python之字典添加元素手动推荐知识点字典创建->创建字典(7种方式)删除元素->字典删除元素(6种方式)修改元素->字典修改元素(4种方式)遍历元素->字典遍历元素(4种方式)查找元素->字典查找元素(3种方式)本文使用代码book_dict={“price”:500,”bookName”:”Python设计”,”weight”:”250g”}第一种方式:使用[]book_dict[“owner”]=”tyson”说明:中.

    2022年6月17日
    41
  • shuffle model_什么是did模型

    shuffle model_什么是did模型原文链接::https://arxiv.org/abs/1707.01083Abstract论文提出了一种计算效率极高的卷积神经网络结构——ShuffleNet,它是专门为计算能力有限的移动平台设计的。这个新结构用来两个新操作——逐渐群卷积(pointwisegroupconvulution)和通道混洗(channelshuffle)在保障精确率损失不大的同时大大减少了计算成本。基于Im…

    2022年9月9日
    0
  • pycharm导包时出现错误怎么解决_pycharm引入模块报错

    pycharm导包时出现错误怎么解决_pycharm引入模块报错pycharm导包错误没有警告

    2025年6月15日
    0
  • idea配置tomcat服务器运行项目_idea添加tomcat服务器

    idea配置tomcat服务器运行项目_idea添加tomcat服务器需求背景      从Eclipse转IDEA后面对的第一个问题,就是要为IDEA配置tomcat服务,否则不可用。那么,功能需求      那么,该如何配置呢?1、点击“EditConfigurations”进入tomcat服务编辑页面。如下图所示:2、点击…

    2022年10月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号