📜  Java中的泛型类

📅  最后修改于: 2022-05-13 01:55:48.933000             🧑  作者: Mango

Java中的泛型类

Java泛型被引入来处理类型安全的对象。它使代码稳定。 Java泛型方法和类,使程序员能够使用单个方法声明、一组相关方法、一组相关类型泛型还提供编译时类型安全,允许程序员在编译时捕获无效类型。通用手段 参数化 类型。使用泛型,想法是允许任何数据类型 无论是Integer、String还是任何用户定义的数据类型,都可以创建使用不同数据类型的类。

泛型类只是意味着该类中的项或函数可以用参数(例如T )进行泛化 指定我们可以添加任何类型作为参数来代替T ,如 Integer、 字符、String、Double 或任何其他用户定义的类型。

示例:单一类型参数

class Solution
{
   T data;
   public static T getData(){
       return data;
   }
}

示例:多个类型参数

public class Pair {

    private K key;
    private V value;

    public Pair(K key, V value) {
    this.key = key;
    this.value = value;
    }

    public K getKey()    { return key; }
    public V getValue() { return value; }
}

在这个例子中,我们可以多次使用这个类的对象或实例,并使用不同的参数作为T类型。如果我们希望数据是int类型, T可以替换为 Integer,对于 String、 字符、Float 或任何用户定义的类型也是如此。泛型类的声明与泛型类的声明几乎相同,只是类名后跟类型参数部分。泛型类的类型参数部分可以有一个或多个用逗号分隔的类型参数。

我们可以编写一个可以使用不同类型参数调用的通用方法声明。根据传递给泛型方法的参数类型,编译器适当地处理每个方法调用。以下是定义泛型方法的规则

  • 所有泛型方法声明都有一个由尖括号<>指示的类型参数部分,该部分位于方法的返回类型之前。
  • 每个类型参数部分可以包含一个或多个以逗号分隔的类型参数。类型参数或类型变量是指定泛型类型名称的标识符。
  • 类型参数可用于声明称为实际类型参数的返回类型。
  • 泛型方法的主体声明与任何非泛型方法的主体一样。需要注意的一点是,类型参数只能表示引用类型,而不能表示原始类型(如 int、double和 char)。

Java泛型的优点

1. 类型安全:泛型中只能保存一种类型的对象。

2.不需要类型转换:不需要类型转换。

例子:

Before Generics 
     List l= new ArrayList();
     l.add("India");
     String s = (String) list.get(0);     // typecasting  
                                          
After Generics, typecasting of the object is not required 
      List l = new ArrayList();    
      l.add("hello");    
      String s = list.get(0);   

3.编译时检查:它在编译时检查与泛型相关的所有数据类型错误,因此在运行时不会出现问题

List list = new ArrayList();    
list.add("hello");    
list.add(32);   //Compile Time Error   

对于 Generic 类的实例

BaseType  object = new BaseType ();

注意:在参数类型中,我们不能使用 int、char、float原语。

例子:

Java
// Java program to show the
// instance of a generic class
  
// Generic Classes
  
// we use <> to specify parameter
// type and we can add any datatype
// like Integer, Double, String,
// Character or any user defined
// Datatype
  
// Every time when we need to make an
// object of another datatype of this
// generic class , we need not to make
// the whole class of that datatype again
// instead we can simply change the
// parameter/Datatype in braces <>
  
public class Area {
  
    // T is the Datatype like String,
    // Integer of which Parameter type,
    // the class Area is of
    private T t;
  
    public void add(T t)
    {
        // this.t specify the t variable inside
        // the Area Class whereas the right hand
        // side t simply specify the value as the
        // parameter of the function add()
        this.t = t;
    }
  
    public T get() { return t; }
  
    public void getArea() {}
  
    public static void main(String[] args)
    {
        // Object of generic class Area with parameter Type
        // as Integer
        Area rectangle = new Area();
        // Object of generic class Area with parameter Type
        // as Double
        Area circle = new Area();
        rectangle.add(10);
        circle.add(2.5);
        System.out.println(rectangle.get());
        System.out.println(circle.get());
    }
}


输出
10
2.5