我正在尝试制作一种方法,该方法将可变对象类型作为参数,然后根据传递的对象来更新数据库,这有点像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();
}
而且Cycle类中的方法如下所示:
public String getId() {
return this.cycleId;
}
您可以使用通用类型范围来实现。
定义:
public <T extends SomeType> void upsertObject(Class<T> objectClass, T actualObject) { }
SomeType
类或接口在哪里,您将可以SomeType
在actualObject
实例上调用方法。
这会将这种方法限制为只能与扩展SomeType
(如果是类)或实现SomeType
(如果是接口)的类型一起使用。
例如:
public interface SomeType {
String getId();
}
和:
public <T extends SomeType> void upsertObject(Class<T> objectClass, T actualObject) {
if (actualObject.getId() != null) {
...
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句