首页 > 编程语言 >第一百一十节 Java面向对象设计 - Java泛型类

第一百一十节 Java面向对象设计 - Java泛型类

时间:2024-06-17 22:31:00浏览次数:13  
标签:Java String Wrapper 面向对象 参数 类型 泛型 obj

Java面向对象设计 - Java泛型类

使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数和方法。

泛型类是使用形式类型参数定义的。

形式类型参数是一个逗号分隔的变量名列表,位于类声明中类名后面的尖括号<>中。

语法

下面的代码声明一个类Wrapper,它接受一个形式类型参数:

public class Wrapper<T>  {

}

该参数已命名为T.

T是一个类型变量,它可以是Java中的任何引用类型,例如String,Integer,Double等。

当使用Wrapper类时,指定形式类型参数值。

形式参数

采用形式类型参数的类也称为参数化类。

您可以声明Wrapper类的变量,将String类型指定为其形式类型参数的值,如下所示。

这里,String是实际的类型参数。

Wrapper<String> stringWrapper;

Java允许我们使用泛型类而不指定形式类型参数。

用法

这是为了向后兼容。您还可以声明Wrapper<T>类的变量,如下所示:

Wrapper  aRawWrapper;

当使用泛型类而不指定实际的类型参数时,它被称为原始类型。上面的声明使用Wrapper <T>类作为原始类型,因为它没有指定T的值。

泛型类的实际类型参数必须是引用类型。

原始类型不允许作为泛型类的实际类型参数。

类可以采用多个正式类型参数。下面的代码声明一个Mapper类,它接受两个形式参数T和R:

public class Mapper<T, R>    {

}

我们可以声明Mapper <T,R>类的变量如下:

Mapper<String, Integer>  mapper;

这里,实际的类型参数是String和Integer。

形式类型参数在类体中可用作类型。

public class Wrapper<T> {
  private T obj;

  public Wrapper(T obj) {
    this.obj = obj;
  }

  public T get() {
    return obj;
  }

  public void set(T obj) {
    this.obj = obj;
  }
}

Wrapper<T>类使用形式类型参数来声明实例变量obj,以声明其构造函数和set()方法的形式参数,以及作为get()方法的返回类型。

您可以通过为构造函数指定实际的类型参数来创建泛型类型的对象,如下所示:

Wrapper<String> w1  = new Wrapper<String>("Hello");

我们可以省略实际的类型参数。在下面的代码中,编译器会将构造函数的实际类型参数推断为String:

Wrapper<String> w1  = new Wrapper<>("Hello");

一旦你声明了泛型类的一个变量,你可以把形式类型参数看作是指定的实际类型参数。

现在,你可以认为,对于w1,Wrapper类的get()方法返回一个String。

String s1=  w1.get();

例子

以下代码显示如何使用Wrapper类。

public class Main {
  public static void main(String[] args) {
    Wrapper<String> w1 = new Wrapper<>("Hello");
    String s1 = w1.get();
    System.out.println("s1=" + s1);

    w1.set("Testing generics");
    String s2 = w1.get();
    System.out.println("s2=" + s2);

    w1.set(null);
    String s3 = w1.get();
    System.out.println("s3=" + s3);
  }
}

class Wrapper<T> {
  private T obj;

  public Wrapper(T obj) {
    this.obj = obj;
  }

  public T get() {
    return obj;
  }

  public void set(T obj) {
    this.obj = obj;
  }
}

标签:Java,String,Wrapper,面向对象,参数,类型,泛型,obj
From: https://blog.csdn.net/2301_78772942/article/details/139756116

相关文章

  • Java面向对象:初识继承
    继承:一个类(子类或派生类)继承另一个类(父类或基类)的特性(属性和方法)。1、继承1.1、不使用继承例子:classDog{Stringname;intage;publicDog(Stringname,intage){this.name=name;this.age=age;}publicvoideat(){......
  • 面经梳理-java多线程同步协作
    题目Synchronized和ReentryLock锁锁可以视作访问共享数据的许可证。锁能够保护共享数据以实现线程安全,其作用包括保障原子性、保障可见性和保障有序性。Java平台中的锁包括内部锁(IntrinsicLock)和显式锁(ExplicitLock)。内部锁是通过synchronized关键字实现的;显式锁是通过java.ut......
  • 面经梳理-java多线程其他
    题目Threadlocal使用场景?原理?如何保证内存不泄露?ThreadLocal使用场景不加锁的情况下,多线程安全访问共享变量,每个线程保留共享变量的副本(线程特有对象),每个线程往这个ThreadLocal中读写是线程隔离。ThreadLocal原理Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量th......
  • 深入探讨JavaScript的执行机制
    预编译首先下面这段代码的执行是一个怎样的结果呢?showName();console.log(MyName);varMyName='小陈同学'functionshowName(){console.log('函数showName被执行');}在这段代码中我们声明了一个变量MyName和一个函数showName,调用函数,打印MyName因为在函......
  • 面经梳理-java多线程基础
    题目线程和进程的概念?守护线程是干什么的?常见的守护线程有哪些?线程和进程的概念进程是程序的运行实例,是程序向操作系统申请资源的基本单位,线程是进程的一条执行路径。Java的线程分为两种:用户线程和守护线程。守护线程作用是为其他线程提供服务,如果所有的用户线程死亡,后台线程......
  • 面经梳理--java
    题目Java创建一个对象的方法有几种?使用new关键字反射(1)使用Class类的newInstance方法,只能无参构造器Employeeemp2=(Employee)Class.forName("org.programming.mitra.exercises.Employee").newInstance();或者(目前Class.newInstance()这种方法因为效率问题已经被标记@......
  • 面向对象程序设计1.2 类之间的组合关系
    一、复习一下在1.1里我们定义了类Date,忘记的小伙伴可以看看下面的代码classDate{private:intyear;intmonth;intday;//数据成员,默认为私有public:Date():year(2000),month(1),day(1){}//不带参数的构造函数Date(intyear,intmonth,in......
  • 45.JavaScript基础【三】
    【一】JavaScript之函数1)函数声明函数须先声明,才能使用函数声明时不会立即执行,只有调用时才会执行function函数名(参数1,参数2){ 代码体}2)函数调用函数名()函数的执行与定位位置无关,只与调用位置有关可多次调用,每次调用都是独立不相关的3)函数分类1.无......
  • 44.JavaScript基础【二】
    【一】JavaScript之运算符1)算术运算符加法:+减法:-乘法:*除法:/优先运算:()取余:%特殊NaNNaN参与的运算结果全是NaN隐式转化null转成0undefined转成NaN2)比较运算符>大于<小于<=小于等于>=大于等于==相等!=不相等===全等与相等区别在于会判断数据......
  • 43.JavaScript基础【一】
    【一】JavaScript1)介绍也是一门编程语言,他可以写后端代码JS是由ECMAScript、DOM、BOM组成JS是运行在浏览器脚本的语言2)注释语法//单行注释/*多行注释多行注释*/3)js代码的书写位置head头里面的script标签中写在body体最下面直接常见一个js脚本文件,......