Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

我们前面讨论了Java泛型。在本教程中,我们将看看Java中的泛型构造函数。

泛型构造函数是至少具有泛型类型的一个参数的构造函数。

我们将看到泛型构造函数不必在泛型类中,而且并不是泛型类中的所有构造函数都必须是泛型的。

2.非泛型类

首先,我们有一个简单的类条目,它不是泛型类:

public class Entry {private String data;私人int等级;}

在这个类中,我们将添加两个构造函数:一个带有两个参数的基本构造函数和一个泛型构造函数。

2.1。基本构造函数

第一个条目构造函数是一个带有两个参数的简单构造函数:

public Entry(String data, int rank) {this。data =数据;这一点。排名=等级;}

现在,让我们使用这个基本构造函数来创建一个条目对象:

@Test public void givenNonGenericConstructor_whenCreateNonGenericEntry_thenOK() {Entry Entry = new Entry("sample", 1);assertequal(“样本”,entry.getData ());assertequal (entry.getRank ());}

2.2。泛型构造函数

接下来,我们的第二个构造函数是一个泛型构造函数:

public  Entry(E元素){this。data = element.toString ();这一点。排名= element.getRank ();}

虽然条目类不是泛型的,它有一个泛型构造函数,就像它有一个参数一样元素类型的E

泛型类型E是有界的,应该实现两者吗Rankable可序列化的接口。

现在,让我们来看看Rankable接口,它有一个方法:

public interface Rankable {public int getRank();}

假设我们有一个类产品实现Rankable接口:

public class Product implements Rankable, Serializable {private String name;私人双价格;私人int销售;public Product(String name, double price) {this.name = name;这一点。价格=价格;} @Override public int getRank() {return sales;}}

然后,我们可以使用泛型构造函数来创建条目对象的使用产品:

@Test public void givenGenericConstructor_whenCreateNonGenericEntry_thenOK() {Product Product = new Product("milk", 2.5);product.setSales (30);条目条目=新条目(产品);entry.getData assertequal (product.toString () ());assertequal (30, entry.getRank ());}

3.泛型类

接下来,我们将查看一个泛型类GenericEntry:

public class GenericEntry {private T data;私人int等级;}

我们还将在该类中添加与上一节相同的两种构造函数类型。

3.1。基本构造函数

首先,让我们为我们的GenericEntry类:

public GenericEntry(int rank){这个。排名=等级;}

尽管GenericEntry是一个泛型类,这是一个没有泛型类型参数的简单构造函数。

现在,我们可以使用这个构造函数来创建GenericEntry <字符串>:

@Test public void givenNonGenericConstructor_whenCreateGenericEntry_thenOK() {GenericEntry entry = new GenericEntry(1);assertNull (entry.getData ());assertequal (entry.getRank ());}

3.2。泛型构造函数

接下来,我们将第二个构造函数添加到类中:

public GenericEntry(T data, int rank){这个。data =数据;这一点。排名=等级;}

这是一个通用构造函数,因为它有一个数据泛型类型的参数T注意,我们不需要添加< T >在构造函数声明中,因为它隐式地存在。

现在,让我们测试我们的泛型构造函数:

@Test public void givenGenericConstructor_whenCreateGenericEntry_thenOK() {GenericEntry entry = new GenericEntry("sample", 1);assertequal(“样本”,entry.getData ());assertequal (entry.getRank ());}

4.具有不同类型的泛型构造函数

在泛型类中,还可以有一个泛型类型与类的泛型类型不同的构造函数:

public  GenericEntry(E元素){data = (T)元素;这一点。排名= element.getRank ();}

GenericEntry构造函数有一个参数元素E,这与T类型。让我们看看它的实际应用:

@Test public void givenGenericConstructorWithDifferentType_whenCreateGenericEntry_thenOK() {Product Product = new Product("milk", 2.5);product.setSales (30);GenericEntry entry = new GenericEntry(product);assertequal(产品,entry.getData ());assertequal (30, entry.getRank ());}

注意:

  • 在我们的例子中,我们使用了产品(E)创建一个GenericEntry类型的可序列化的(T)
  • 只有当形参的类型为时,才能使用此构造函数E可以转换为T

5.多个泛型类型

接下来,我们有泛型类MapEntry有两种泛型:

public class MapEntry {private K key;私人V值;public MapEntry(K key, V value) {this。键=键;这一点。值=价值;}}

MapEntry有一个具有两个参数的泛型构造函数,每个参数的类型不同。让我们在一个简单的单元测试中使用它:

@Test public void givenGenericConstructor_whenCreateGenericEntryWithTwoTypes_thenOK() {MapEntry entry = new MapEntry("sample", 1);assertequal(“样本”,entry.getKey ());.intValue assertequal (entry.getValue () ());}

6.通配符

最后,我们可以在泛型构造函数中使用通配符:

公共GenericEntry(可选< ?extends Rankable>可选){if (optional. ispresent ()) {this。data = (T)可选。get();这一点。.getRank排名= optional.get () ();}}

这里,我们在这里使用了通配符GenericEntry构造函数来绑定可选类型:

@Test public void givenGenericConstructorWithWildCard_whenCreateGenericEntry_thenOK() {Product Product = new Product("milk", 2.5);product.setSales (30);>可选=可选。of(Product);GenericEntry entry = new GenericEntry(可选);assertequal(产品,entry.getData ());assertequal (30, entry.getRank ());}

注意,我们应该能够对可选参数类型进行强制转换(在本例中,产品)GenericEntry类型(在我们的例子中,可序列化的)。

7.结论

在本文中,我们学习了如何在泛型和非泛型类中定义和使用泛型构造函数。

完整的源代码可以在上面找到GitHub

Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
本文评论关闭!