我们可以使用泛型 来让我的类, 方法 以及接口 不局限于单一数据类型的操作 可以根据具体需求操作不同数据类型
下面是一些常见的示例,演示了在哪些情况下可以使用类型参数 <T>:
泛型类
我们通常将泛型类定义为以下格式:
<pre class="language-java line-numbers"><code>
public class MyClass<T>{
// ...
}
</code></pre>
这允许我们在创建 MyClass 对象时指定一个类型参数,例如:
<pre class="language-java line-numbers"><code>
MyClass<Integer> obj = new MyClass>>();
</code></pre>
也可以创建一个 MyClass 对象,同时依旧保留有类型参数的灵活性。即:
<pre class="language-java line-numbers"><code>
MyClass<?> obj = new MyClass<>();
</code></pre>
这种方式能够让我们传递任意类型的数据给对象,并且不会限制参数的值范围和类型。
泛型方法
Java 也支持定义泛型方法,语法如下:
<pre class="language-java line-numbers"><code>
public <T> void myMethod(T obj) {
// ...
}
</code></pre>
其中 <T> 是类型参数,用来表示后面的方法参数的具体类型。这个方法可以接受任何类型的参数,编译器会在编译期间自动识别出传入参数的实际类型。
接口和可继承性
泛型接口也是非常常见的。我们可以将类型参数应用于接口中的方法签名。例如:
<pre class="language-java line-numbers"><code>
public interface MyInterface<T> {
T doSomething(T param);
}
</code></pre>
// 实现 MyInterface 接口
<pre class="language-java line-numbers"><code>
public class MyImpl implements MyInterface<String> {
@Override
public String doSomething(String param) {
return param;
}
}
</code></pre>
这里,在定义 MyInterface 时,我们指定了一个类型参数 T,然后在其方法签名中使用了该类型参数。当实现该接口时,需要将类型参数具体化,即传入实际类型,例如上述代码中的 String 类型。
通过泛型接口,我们可以方便地与不同类型的数据交互,并且可以使实现类保留灵活性。
泛型限制
Java 还支持对泛型参数进行限制,以确保类型安全性。如下所示:
<pre class="language-java line-numbers"><code>
public class MyClass<T extends Comparable<T>> {
// ...
}
</code></pre>
在这个例子中,类型参数 T 被限制为只能是实现了 Comparable 接口的类类型。这样做可以在编译期间捕获类型错误,避免运行时错误的发生。
总之,通过在泛型代码中使用类型参数 <T>,我们可以使代码更加灵活、复用和易于维护。这使得 Java 的泛型成为一种非常强大的语言特性,能够满足各种复杂的开发需求。
这里的T可以替换, 甚至 可以使用 26个字母来代表有26个不一样的变量类型。
另外需要注意的是,虽然我们可以在Java程序中定义任意数量的类型参数,但过多的类型参数可能会导致代码难以阅读和维护,因此需要根据实际情况合理使用。
我们可以使用所有 Unicode 字符(甚至是中文 当然前提是你能承受同事的怒火)或任何单词来替换这里的T ,只要能够清晰体现出类型参数的含义即可。 因此,在理论上我们可以使用26个字母和其他单词或符号来表示无数多个泛型类型。
虽然 Java 编码规范建议在泛型中使用一些特定的标记符,但这并不是强制要求,开发者可以按照自己的需求、开发场景和代码风格选择适合的命名方式。