![](/img/trans.png)
[英]Java: How do you enforce a class type parameter to be the same as generic type specified in a generic method?
[英]How do you call a method of a generic type in 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();
}
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) {
...
}
}
假设这不必是绝对通用的(例如,向上插入java.lang.Integer
可能没有意义,对吗?),我将定义一个包含您需要的所有方法的接口,并添加通用分类:
public interface Upsertable {
int getID();
// Other methods you may need...
}
public <T extends Upsertable> void upsertObject(Class<T> objectClass, T actualObject) { }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.