如何在 java 中调用泛型方法?



我正在尝试创建一个方法,该方法将变量对象类型作为参数,然后根据传递的对象更新数据库,有点像Petapoco在C#上的工作方式。为此,我尝试使用一种通用方法,其中传递的对象在插入/更新到其相关表中之前通过了许多检查。关于Stack Overflow的许多问题都指向我使用这样的方法签名:

public <T> void upsertObject(Class<T> objectClass, T actualObject) { }

在方法中,我希望能够调用像actualObject.getId()这样的方法,但编译器需要知道对象的实际类型才能调用其相关方法。有什么办法吗?我将如何实现这些调用?

编辑:

为更清晰而编辑

添加绑定 T 的接口后,我发现我收到错误:

"无法从 CycleComponent 类型对非静态方法 getId(( 进行静态引用">

该方法现在看起来像这样,错误行位于 T.getId(( 下

public <T extends CycleComponent> void upsertObject(Class<T> objectClass, T fitProObject) {
if (objectClass.getName() == "Cycle") {
if (isInserted(T.getId(), "Cycles")) {
// update the database
}else {
// insert into the database
}
}
}

界面如下所示:

public interface CycleComponent {
String getId();
}

循环类中的方法如下所示:

public String getId() {
return this.cycleId;
}

您可以使用泛型类型边界来执行此操作。

定义:

public <T extends SomeType> void upsertObject(Class<T> objectClass, T actualObject) { }

其中SomeType是一个类或接口,您将能够在actualObject实例上调用SomeType方法。

这会将此方法限制为仅与扩展SomeType(如果是类(或实现SomeType(如果它是接口(的类型一起使用。

例如:

public interface SomeType {
String getId();
}

和:

public <T extends SomeType> void upsertObject(Class<T> objectClass, T actualObject) {
if (actualObject.getId() != null) {
...
}
}

假设这不一定是绝对通用的(例如,更新插入java.lang.Integer可能没有意义,对吧?(,我会定义一个包含您需要的所有方法的接口,并将其添加到通用分类中:

public interface Upsertable {
int getID();
// Other methods you may need...
}
public <T extends Upsertable> void upsertObject(Class<T> objectClass, T actualObject) { }

最新更新