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