当前位置:首页 > Java

如何使用泛型Java

2026-03-18 14:12:11Java

泛型的基本概念

泛型是Java 5引入的特性,允许在类、接口或方法中使用类型参数。泛型的主要目的是提供编译时类型安全检查,并减少类型转换的需求。泛型通过类型参数化实现代码的复用性和类型安全。

泛型类

泛型类在类名后使用尖括号<>定义类型参数。类型参数可以是任何标识符,通常使用大写字母如TEKV等。

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

使用泛型类时,指定具体的类型参数:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String value = stringBox.getContent(); // 无需类型转换

泛型方法

泛型方法在方法返回类型前使用尖括号<>定义类型参数。泛型方法可以是静态或非静态的。

public class Util {
    public static <T> T getMiddle(T[] array) {
        return array[array.length / 2];
    }
}

调用泛型方法时,编译器通常可以推断类型参数:

String[] names = {"Alice", "Bob", "Charlie"};
String middle = Util.getMiddle(names); // 类型推断为String

泛型接口

泛型接口与泛型类类似,在接口名后使用尖括号<>定义类型参数。

public interface List<T> {
    void add(T element);
    T get(int index);
}

实现泛型接口时,可以指定具体类型或保留类型参数:

public class ArrayList<T> implements List<T> {
    // 实现方法
}

类型通配符

类型通配符?用于表示未知类型,通常用于方法参数或返回值。通配符可以结合上限或下限使用。

  • <? extends T>:表示类型是T或其子类。
  • <? super T>:表示类型是T或其父类。
public void printList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}

泛型限制

泛型在Java中有一些限制需要注意:

  • 不能使用基本类型作为类型参数(如intdouble),必须使用包装类(如IntegerDouble)。
  • 不能创建泛型数组(如new T[10])。
  • 不能直接实例化类型参数(如new T())。
  • 不能在静态上下文中使用类的类型参数。

泛型与继承

泛型类或接口的继承关系与普通类不同。例如,List<String>不是List<Object>的子类。如果需要处理不同类型的泛型集合,可以使用通配符。

List<String> strings = new ArrayList<>();
List<?> objects = strings; // 合法

类型擦除

Java的泛型是通过类型擦除实现的。编译器在编译时检查类型安全,但在运行时会将类型参数擦除为其上限(通常是Object)。因此,泛型信息在运行时不可用。

Box<String> stringBox = new Box<>();
Box<Integer> intBox = new Box<>();
System.out.println(stringBox.getClass() == intBox.getClass()); // 输出true

实际应用示例

以下是一个使用泛型的实际示例,展示了如何实现一个通用的缓存类:

public class Cache<K, V> {
    private Map<K, V> map = new HashMap<>();

    public void put(K key, V value) {
        map.put(key, value);
    }

    public V get(K key) {
        return map.get(key);
    }
}

使用示例:

如何使用泛型Java

Cache<String, Integer> scoreCache = new Cache<>();
scoreCache.put("Alice", 90);
int score = scoreCache.get("Alice"); // 返回90

通过泛型,可以确保键和值的类型安全,避免运行时类型错误。

分享给朋友:

相关文章

java如何使用

java如何使用

Java 基本使用方法 Java 是一种广泛使用的编程语言,适用于开发各种类型的应用程序。以下是 Java 的基本使用方法,包括环境配置、语法基础和常用操作。 安装 Java 开发环境 下载并安装…

react如何使用redux

react如何使用redux

使用 Redux 在 React 中的应用 Redux 是一个状态管理库,通常与 React 结合使用以管理全局状态。以下是具体实现步骤: 安装依赖 确保项目中已安装 redux 和 react-r…

react refs 如何使用

react refs 如何使用

React Refs 的基本概念 Refs 是 React 提供的一种访问 DOM 节点或 React 组件实例的方式。通常在 React 的数据流中,父子组件通过 props 进行通信,但在某些情况…

react如何使用link

react如何使用link

使用 Link 组件进行页面导航 在 React 中,Link 是 react-router-dom 提供的组件,用于在单页应用(SPA)中实现客户端路由导航,避免页面刷新。 安装 react-…

react 如何使用fiber

react 如何使用fiber

使用 React Fiber 的方法 React Fiber 是 React 16 引入的重新实现的协调算法,用于优化渲染性能。以下是使用 Fiber 的方法。 理解 React Fiber 的核心…

如何使用react native

如何使用react native

安装开发环境 确保系统已安装Node.js(建议LTS版本)。通过npm或yarn全局安装React Native命令行工具: npm install -g react-native-cli # 或…