Java 泛型
泛型最早是在 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 类的子类。