Java 泛型

原文:https://www.studytonight.com/java/generic-in-java.php

泛型最早是在 Java5 中引入的。现在它是 java 编程语言最深刻的特征之一。泛型编程使程序员能够创建类、接口和方法,其中数据类型被指定为参数。它提供了编写独立于任何特定类型数据的算法的工具。泛型还提供类型安全。类型安全意味着在执行操作之前,确保对正确类型的数据执行操作。

使用泛型,可以创建一个单独的类、接口或方法来自动处理所有类型的数据(整数、字符串、浮点等)。它扩展了安全轻松地重用代码的能力。

在引入泛型之前,通用类、接口或方法是使用 Object 类型的引用创建的,因为 Object 是 Java 中所有类的超级类,但是这种编程方式并不能保证类型安全。

创建泛型类型对象的语法

Class_name <data type> reference_name = new Class_name<data type> ();
OR
Class_name <data type> reference_name = new Class_name<>();

这也称为创建泛型对象的菱形符号


泛型类的示例

 //<> brackets indicates that the class is of generic type
class Gen <T> 
{
  T ob;     //an object of type T is declared<
  Gen(T o)  //constructor
  {
    ob = o;
  }
  public T getOb()
  {
    return ob;
  }
}

class Demo
{
  public static void main (String[] args)
  {
    Gen < Integer> iob = new Gen<>(100);   //instance of Integer type Gen Class
    int  x = iob.getOb();
    System.out.println(x);
    Gen < String> sob = new Gen<>("Hello");  //instance of String type Gen Class
    String str = sob.getOb();
    System.out.println(str);
  }
}

你好

在上面的程序中,我们首先向泛型类传递了一个Integer类型参数。然后,我们将一个String类型参数传递给同一个泛型类。因此,我们为两种不同的数据类型重用了同一个类。因此,泛型很容易帮助代码重用。

泛型仅适用于对象

泛型只适用于对象,即类型参数必须是Class类型。您不能使用诸如 int、char 等基本数据类型。泛型类型。它应该永远是一个对象。我们可以使用所有的包装类对象和String类对象作为泛型类型。

Gen**<int>** iOb = new Gen**<int>**(07);   //Error, can't use primitive type

不同类型参数的泛型类型从不相同

一个泛型类型的引用永远不会与其他泛型类型兼容,除非它们的类型参数相同。在上面的例子中,我们创建了两个类对象 Gen ,一个类型为 Integer ,另一个类型为 String ,因此,

iob = sob;  //Absolutely Wrong

无法创建泛型类型的数组

泛型编程中不允许创建泛型类型数组。我们可以引用一个数组,但是不能实例化它。

例如,在上面的程序中,在 Gen 类

t a[];//这是允许的

T a[] =新的 T[10];//这是不允许的

具有多个参数的泛型类型

在泛型参数化类型中,我们可以将多个数据类型作为参数传递。它的工作方式与一个参数泛型类型相同。

class Gen <T1,T2>
{
  T1 name;
  T2 value;

  Gen(T1 o1,T2 o2)
  {
    name = o1;
    value = o2;
  }

  public T1 getName()
  {
    return name;
  }

  public T2 getValue()
  {
    return value;
  }

}

class Demo
{
  public static void main (String[] args)
  {
    Gen < String,Integer> obj = new Gen<>("StudyTonight",1);

    String  s = obj.getName();
    System.out.println(s);

    Integer i = obj.getValue();
    System.out.println(i);
  }
}

今晚学习 1

注意:由于泛型类中有两个参数——T1 和 T2,因此,在创建这个泛型类的实例时,我们需要提到两个需要作为参数传递给这个类的数据类型。

通用方法

您还可以创建可以用不同类型的参数调用的泛型方法。根据传递给泛型方法的Parameter类型,编译器处理每个方法。

泛型方法的语法包括尖括号内的类型参数,并且应该出现在方法的返回类型之前。

<type-parameter> return_type method_name (parameters) {...}

通用方法示例

class Demo
{
  static <V, T> void display (V v, T t)
  {
    System.out.println(v.getClass().getName()+" = " +v);
    System.out.println(t.getClass().getName()+" = " +t);
  }
  public static void main(String[] args)
  {
    display(88,"This is string");
  }
}

Java 语。整数= 88 java lang。字符串=这是字符串


Java 中的泛型构造器

即使类不是泛型的,也可以创建泛型构造器。

通用构造器示例

class Gen
{
  private double val;
  <T extends Number> Gen(T ob)
  {
    val = ob.doubleValue();
  }
  void show()
  {
    System.out.println(val);
  }
}

class Demo
{
  public static void main(String[] args)
  {
    Gen g = new Gen(100);
    Gen g1 = new Gen(121.5f);
    g.show();
    g1.show();
  }
}

100.0 121.5

泛型有界类型参数

还可以对允许传递给类型参数的类型设置限制。这是在指定类型参数时借助 extends 关键字完成的。

 < T extends Number >

这里我们取了类,它可以是任何包装器类名。这规定了 T 只能被类数据本身或其任何子类代替。

具有有界类型参数的泛型方法

在这个例子中,我们创建了一个只允许数字类型或其子Class类型的显示方法。

class Demo
{
  static < T, V extends Number> void display(T t, V v)
  {
    System.out.println(v.getClass().getName()+" = " +v);
    System.out.println(t.getClass().getName()+" = " +t);
  }
  public static void main(String[] args)
  {
    display ("this is string",99);
  }
}

java.lang.String =这是字符串 java.lang.Double = 99。O

类型五只限于数字类型及其子类。如果display(88,"This is string")没有注释,会给出类型不兼容的错误,因为 String 不是 Number 类的子类。