繁体   English   中英

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

[英]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是一个类或接口,你就可以调用的方法SomeTypeactualObject实例。

这将限制此方法仅用于扩展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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM