gpt4 book ai didi

java - Java 中泛型作为函数内的对象

转载 作者:行者123 更新时间:2023-12-02 01:44:16 25 4
gpt4 key购买 nike

如何在 Java 中的函数内使用泛型作为对象。例如,我有一个删除节点的函数。当我尝试调用 Generic 的对象过程时,它会触发错误。

private <T> void deleteNodes(ArrayList<DepartmentHierarchy> newHierarchy) {

StructureFacade structureFacade = StructureFactory.getClassInstance("DEPARTMENT");
List<T> departmentModels = structureFacade.findAllByCompanyIdEquals(1L); // its Ok
Set<Long> current_ids = new HashSet<>();
for (T item: departmentModels) { // its Ok
current_ids.add(item.getId()); // Here is Error
}

然后调用函数:

this.<DepartmentModel>deleteNodes(newHierarchy);

一切正常,直到我调用泛型方法。

item.getId()

它抛出错误:

Error:(168, 33) java: cannot find symbol
symbol: method getId()
location: variable item of type T
Information:java: D:\HierarchyStructureController.java uses unchecked or unsafe operations.
Information:java: Recompile with -Xlint:unchecked for details.

最佳答案

您的问题是,您正在对一个对象调用 getId(),而编译器无法保证已定义 getId() 方法。编译器正在完成它的工作,阻止您调用可能不存在的方法。

处理此问题的最佳方法是拥有某种接口(interface),其中列出了 getId() 方法,以及 T 对象所需的任何其他方法具有。如果您将界面称为“可识别”,它可能如下所示。

public interface Identifiable {
long getId();
}

然后,任何可能用于 T 的类都应该在其声明中包含 implements Identifying

最后,将您的方法签名更改为此。这将强制 T 始终是实现您的接口(interface)的类。它还允许编译器接受 T 类的任何对象都将具有 getId() 方法。

private <T extends Identifiable> void deleteNodes(ArrayList<DepartmentHierarchy> newHierarchy) {

关于java - Java 中泛型作为函数内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53940016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com