是的,Java中的接口和方法都可以使用泛型,它们是泛型特性的重要组成部分。下面通过具体示例来展示泛型接口和泛型方法的使用:
一、泛型接口
泛型接口在定义时声明类型参数,实现类可以指定具体类型或继续保留泛型。
示例:定义一个泛型仓库接口,支持添加和获取元素
// 泛型接口
interface Repository<T> {
void add(T item);
T get(int index);
int size();
}
// 实现泛型接口(指定具体类型为String)
class StringRepository implements Repository<String> {
private String[] items = new String[10];
private int count = 0;
@Override
public void add(String item) {
if (count < items.length) {
items[count++] = item;
}
}
@Override
public String get(int index) {
return items[index];
}
@Override
public int size() {
return count;
}
}
二、泛型方法
泛型方法是在方法声明时定义类型参数的方法,它可以:
- 定义在普通类中
- 定义在泛型类中
- 拥有独立于类的类型参数
示例:创建一个工具类,包含多个泛型方法
class GenericUtils {
// 泛型方法:交换数组中两个位置的元素
public static <T> void swap(T[] array, int i, int j) {
if (i >= 0 && j >= 0 && i < array.length && j < array.length) {
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
// 泛型方法:查找元素在数组中的索引
public static <T> int findIndex(T[] array, T target) {
for (int i = 0; i < array.length; i++) {
if (array[i].equals(target)) {
return i;
}
}
return -1;
}
}
三、综合使用示例
public class GenericDemo {
public static void main(String[] args) {
// 测试泛型接口
Repository<String> strRepo = new StringRepository();
strRepo.add("Apple");
strRepo.add("Banana");
System.out.println("仓库第一个元素:" + strRepo.get(0));
// 测试泛型方法
Integer[] numbers = {
1, 2, 3, 4, 5};
GenericUtils.swap(numbers, 0, 4); // 交换第一个和最后一个元素
System.out.println("交换后第一个元素:" + numbers[0]);
String[] fruits = {
"Apple", "Banana", "Orange"};
int index = GenericUtils.findIndex(fruits, "Banana");
System.out.println("Banana的索引:" + index);
}
}
输出结果:
仓库第一个元素:Apple
交换后第一个元素:5
Banana的索引:1
特点总结
泛型接口:通过
interface 接口名<T>定义,实现类需指定具体类型或继续使用泛型,常用于规范通用数据结构(如集合框架中的List<T>)。泛型方法:通过
<T>声明类型参数,调用时编译器会自动推断类型,适合实现与类型无关的通用算法(如排序、查找等)。灵活性:泛型接口和方法让代码摆脱了特定类型的束缚,同时保证了类型安全,是Java集合框架、工具类的核心实现方式。