- 在编程中,特别是在面向对象编程(OOP)中,当我们说“形参化类”或“参数化类”,我们实际上是指泛型(Generics)的概念。泛型允许在定义类、接口和方法时使用类型参数。这样,你可以创建可重用的组件,这些组件可以支持多种数据类型而无需为每种类型单独编写代码。
- 假设你有一个名为
Result
的类,它可能用于表示某种操作的结果。这个类可能有一个值和一个状态或错误消息。如果你想要这个类能够处理多种数据类型的结果,你可以使用泛型来定义它。- 下面是一个简单的
Result
类的泛型版本示例:public class Result<T> { private T value; private String errorMessage; private boolean isSuccess; public Result(T value, boolean isSuccess) { this.value = value; this.isSuccess = isSuccess; this.errorMessage = isSuccess ? null : "Operation failed"; } public T getValue() { return value; } public String getErrorMessage() { return errorMessage; } public boolean isSuccess() { return isSuccess; } }
在这个例子中,
Result
类使用了一个类型参数T
,它表示value
字段可以持有的任何类型。你可以这样使用这个类:// 创建一个包含 String 类型结果的 Result 对象 Result<String> stringResult = new Result<>("Hello, World!", true); System.out.println(stringResult.getValue()); // 输出 "Hello, World!" // 创建一个包含 Integer 类型结果的 Result 对象 Result<Integer> integerResult = new Result<>(42, true); System.out.println(integerResult.getValue()); // 输出 42
形参化类(或泛型类)的原始使用是指在没有指定类型参数的情况下使用泛型类。在 Java 中,如果你使用了一个泛型类但没有提供类型参数,编译器会将其视为原始类型。例如:
Result rawResult = new Result(new Object(), true); // 原始类型使用
在这个例子中,
Result
被用作了原始类型,因为没有提供类型参数。这通常是不推荐的,因为它失去了泛型提供的类型安全性。编译器会发出一个未经检查的转换警告,因为原始类型Result
可以接受任何类型的对象作为值,这可能导致运行时错误。为了避免这种情况,最好总是使用具体的类型参数来实例化泛型类,以充分利用类型安全和代码重用的好处。
在使用形参化类
Result
之前,需要先定义该类。下面是一个示例:public class Result<T> {private T value;public Result(T value) {this.value = value;}public T getValue() {return value;}public void setValue(T value) {this.value = value;} }
在这个示例中,
Result
是一个形参化类,使用了类型参数T
。这个类有一个私有字段value
,表示结果的值。类中还包含了一个构造函数和相应的 getter 和 setter 方法。下面是如何使用
Result
类的示例:public class Main {public static void main(String[] args) {Result<Integer> result1 = new Result<>(10);System.out.println(result1.getValue()); // 输出: 10Result<String> result2 = new Result<>("Hello");System.out.println(result2.getValue()); // 输出: HelloResult<Boolean> result3 = new Result<>(true);System.out.println(result3.getValue()); // 输出: true} }
在这个示例中,首先创建了一个
Result
对象result1
,其类型参数T
被设置为Integer
,并且值被设置为10
。然后使用getValue()
方法获取结果的值并输出。类似地,还创建了两个
Result
对象result2
和result3
,分别设置了类型参数T
为String
和Boolean
,并且分别输出了结果的值。