首页 > 编程语言 >Java拾贝第九天——泛型

Java拾贝第九天——泛型

时间:2023-10-23 22:14:05浏览次数:337  
标签:第九天 Java name Point void class 泛型 public

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

如果一个类中,不想限定具体类型的属性,或某个方法的返回值和传参。

可以在类声明时通过一个标识来表示。

这样只需要在实例化类的时候声明具体的类型即可,这就是泛型

泛型类

泛型作用于类上就是泛型类。

栗子:

public class Test9 {
    public static void main(String[] args) {
        MyF<String> f = new MyF<String>();
	//外部来指定类型  第二个<>中的String可以省略
        f.setName("泛型");
    }
}
class MyF<T> {
    private T name;//属性不定义具体类型

    public MyF() {
    }
    public MyF(T name) {//构造方法也可也使用泛型
        this.name = name;
    }
    public T getName() {//返回类型不定义具体类型
        return name;
    }
    public void setName(T name) {//传参不定义具体类型
        this.name = name;
    }
}

上门的MyF类就是泛型的具体体现。其调用了"<T>"形式,泛型表示具体类型是由外部实例化MyF类时指定的。

<>中可以是任意的大写字母,<A>、<B>都可以。这里采用T是type的缩写而已。

基本类型是无法指定的,只能指定引用类型

栗子:

MyF<int> f = new MyF<>();//错错错

传入的类型与泛型不一致。

栗子:

public class Test9 {
    public static void main(String[] args) {
        MyF<Integer> f = new MyF<>();
        f.setName("传入String类型");//编译错误 泛型是Integer类型
    }
}
class MyF<T> {
    private T name;

    public MyF() {
    }
    public MyF(T name) {
        this.name = name;
    }
    public T getName() {
        return name;
    }
    public void setName(T name) {
        this.name = name;
    }
}

传入的类型可以是某个类或其子类

栗子:

public class Test9 {
    public static void main(String[] args) {
        Point<Son> point = new Point<>();
	//Point<Dad> point = new Point<>();一样没问题的
    }
}
class Dad{
    
}
class Son extends Dad{
    
}
class Point<T>{
    private T name;

    public Point() {
    }

    public Point(T name) {
        this.name = name;
    }

    public T getName() {
        return name;
    }

    public void setName(T name) {
        this.name = name;
    }
}

静态不能使用泛型
栗子:

class Point<T>{ 
    static T t;//错错错
    public static T tell(){//编译直接报错 
    }

因为静态处于全局内存区,JVM对静态的初始化会在类实例化之前。

此时使用泛型会导致JVM初始化全局内存不成功。因为泛型是不确定的数据类型

多个泛型

public class Test9 {
    public static void main(String[] args) {
        Point<String, Integer> point = new Point<>("小明",18);
	//外部指定属性name数据类型为String,属性age数据类型为Integer
    }
}

class Point<T,K>{//任意字母都行
    private T name;
    private K age;

    public Point() {
    }

    public Point(T name, K age) {
        this.name = name;
        this.age = age;
    }

    public T getName() {
        return name;
    }

    public void setName(T name) {
        this.name = name;
    }

    public K getAge() {
        return age;
    }

    public void setAge(K age) {
        this.age = age;
    }
}

泛型擦除

即外部不指定具体类型

public class Test9 {
    public static void main(String[] args) {
        Point point = new Point();
        point.setName("小明");
    }
}

class Point<T>{
    private T name;

    public Point() {
    }

    public Point(T name) {
        this.name = name;
    }

    public T getName() {
        return name;
    }

    public void setName(T name) {
        this.name = name;
    }
}

上述栗子会出现不安全警告信息。

虽然不指定泛型类型后编译出现了警告,但是并不影响程序运行。

这是因为Java在这种情况(不指定泛型类型)下采用Object进行接收。也称泛型擦除

泛型接口

泛型作用于接口上就是泛型接口。

栗子:

interface Cat<T>{
   void getCat(T t);
}

泛型接口在被继承与被实现时确定类型

栗子:

interface Cat<T>{
   void getCat(T t);
}
interface Dog extends Cat<String>{//被继承
}
class tc implements Cat<String>{//被实现
    @Override
    public void getCat(String s) {
        System.out.println("不定义会泛型擦除,记得确定数据类型");
    }
}

泛型方法

泛型作用于方法上就是泛型方法。

栗子:

class Gen<T>{
    public <K,V> void tell(T t,K k){//可以使用泛型类中的泛型或泛型方法中的泛型
        System.out.println("泛型类中的泛型方法");
    }
}

泛型方法不光可以在泛型类中,还可以在普通类中。

class Pen{
    public <K,V> void tell(K k){//泛型不一定要全部使用
        System.out.println("普通类中的泛型方法");
    }
}

普通方法也可也使用泛型

class Gen<T>{
    public <K> void tell(T t){//泛型方法
        System.out.println("泛型类中的泛型方法");
    }
    public void say(T t){//只是传参使用泛型而已 这不是泛型方法!!!
        System.out.println("普通方法使用泛型");
    }
}

标签:第九天,Java,name,Point,void,class,泛型,public
From: https://www.cnblogs.com/Ocraft/p/17783597.html

相关文章

  • 数据结构之数组(Java)
    一:概述什么是数组呢?数组对应的英文名为array,是有限个相同类型所组成的集合,数组中的每一个变量被称为元素。数组是最为简单、最为常用的数据结构。举例说明:元素31254972索引01234567正如军队里的士兵存在编号一样,数组中的每一个元素也有着自己的小标,这......
  • JavaWeb中的Filter没有作用
    JavaWeb中的Filter没有作用一、源代码<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body><h1>hellojsp!</h1></body>......
  • JavaScript基础
    学习目标:掌握编程的基本思维掌握编程的基本语法typora-copy-images-to:mediaJavaScript基础JavaScript介绍JavaScript是什么JavaScript是一种运行在客户端的脚本语言Netscape在最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最......
  • Java基础 字符输出流之一——FileWriter
     FileWriter书写细节:1.创建字符输出流对象细节①:参数是字符串表示的路径或者File对象都可以细节②:如果文件不存在会创建一个新的文件,但要保证父级路径是存在的细节③:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关 2.写数据细节:如果write方法的参......
  • Java SOAP 调用 C# 的WebService
    JavaSOAP调用C#的WebService,C#的WebService方法的创建可以参考上一篇文章。IntelliJIDEACommunityEdition2021.2.3的idea64.exe新建项目,导入需要的jar,代码如下:importorg.apache.axis.client.Service;importorg.apache.axis.soap.SOAPConstants;importjavax.xml.n......
  • Java基础 read (char[] buffer) 底层原理
    FileReaderfr=newFileReader("E:\\Java基础资料\\a.txt");char[]chars=newchar[2];while(true){intlen=fr.read(chars);if(len==-1)break;System.out.print(newString(chars,0,len));}fr.close(); read(char[] buffer)......
  • javaweb学习每日总结-第三天
    第三天学习MyBatis 在一天的mybatis学习之后,我了解到了这么一款能够简化jdbc的框架,说到mybatis的作用,就是代替了jdbc,用Java操作数据库,但是他比jdbc更简便更程序化,今天,我在idea配置了mybatis的文件,并且通过mybatis初步查询了数据库中的信息,这也是我第一次使用mybatis来操作数据......
  • java课后动手动脑
    下面是使用Files.walkFileTree()方法来找出指定文件夹下所有大于指定大小的文件的示例代码:1importjava.io.IOException;2importjava.nio.file.*;3importjava.nio.file.attribute.BasicFileAttributes;45publicclassFileSizeFilter{6publicstaticvo......
  • Java基础 Java中编码、解码的方法
    所谓编码,就是把我们要存储的数据变成能真正的存储在硬盘当中的字节数据 编码的方法:public byte[] getBytes()  →  使用默认方式进行编码(idea默认使用UTF-8;eclipse默认使用GBK)public byte[] getBytes(String charsetName)  →  使用指定方式进行编码......
  • Java基础 字符流、字符输入流
    字符流的底层其实就是字节流,只不过在字节流的基础上又添加了字符集的概念(字符流=字节流+字符集) 字符流的特点:输入流:一次读一个字节,遇到中文时,一次读多个字节(GBK一次读两个,UTF-8一次读三个)输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中 字符流应......