无需知道类名即可创建函数

时间:2014-06-04 13:03:09

标签: java javabeans

以下是我要做的事情:

我有这段代码:

    Object selectedCreditId = null;
    int i = 0;
    String selectedCreditName = leasing.getCredit().getDisplayName();
    Collection<DCredRating> selectCreditIds = creditData.getItemIds();
    for (DCredRating id: selectCreditIds) {
        String creditItem = id.getDisplayName();
        if (selectedCreditName.equals(creditItem)) {
            selectedCreditId = creditData.getIdByIndex(i);
        }
            i++;
    }

我想使用此代码创建函数。 该函数将leasing类和creditData BeanItemContainer作为参数并返回selectedCreditId对象。

换句话说就是这样:

private Object getSelectedCreditId(LeasingResP param, BeanItemContainer<...> param2) {
    Object selectedCreditId = null;
    int i = 0;
    LeasingResP leasing = param;
    BeanItemContainer<...> creditData = param2;
    String selectedCreditName = leasing.getCredit().getDisplayName();
    Collection<...> selectCreditIds = creditData.getItemIds();
    for (... id: selectCreditIds) {
        String creditItem = id.getDisplayName();
        if (selectedCreditName.equals(creditItem)) {
            selectedCreditId = creditData.getIdByIndex(i);
        }
            i++;
    }
}

这里的问题是creditData容器可以是不同的类。

有没有&#34;漂亮&#34;这样做的方式,或者我必须为不同的类写一个if块?

3 个答案:

答案 0 :(得分:1)

如果您对容器中收集的bean类型不感兴趣,可以将方法声明如下:

private Object getSelectedCreditId(LeasingResP param, BeanItemContainer<?> param2) {
    ...
}

“?”表示未知类型的容器,因此您只知道它们的类型为Object的bean。

您还可以使方法通用,以便返回正确的类型:

private <T extends DCredRating> T getSelectedCreditId(LeasingResP param, BeanItemContainer<? extends T> param2) {
    ...
}

第二个变体的用法是(例子):

LeasingResP param = ...
BeanItemContainer<DCredRating> container = ...
DCredRating dcr = getSelectedCreditId(param, container);

答案 1 :(得分:0)

如果您不想使用if语句。您可以尝试此操作,创建Interface

import java.util.Collection;

public interface CreditDataInterface {

    public Collection<Long> getItemIds();

    public String getDisplayName();

    public Object getIdByIndex(int i);
}

DCredRating类和其他想要传递给getSelectedCreditId方法的类中实现此接口。 之后,您可以安全地将BeanItemContainer<CreditDataInterface>对象传递给getSelectedCreditId方法。

答案 2 :(得分:0)

“要限制creditData容器的类类型,请使用通用接口(仅包含类签名)将其用作对象类型:

public interface CreditData {
    //...
}

每种creditData类都必须实现这个新界面。

现在将界面用作父类型

private Object getSelectedCreditId(LeasingResP param, BeanItemContainer<? extends CreditData> param2) {
    //...
    BeanItemContainer<? extends CreditData> creditData = param2;
    //...
    Collection<CreditData> selectCreditIds = creditData.getItemIds();
}

==&GT; “? extends CreditData”表示扩展/键入的所有对象 CreditData