使用Generic Type来实现相同的功能

时间:2017-11-01 12:15:40

标签: java generics java-8

我有一个场景,其中两个函数完全相似,但两者中使用的Class对象不同,类似这样,

template<class ImmutableLambda>
void call_yield(ImmutableLambda&& c)
{
    using Fun_t = typename Fun_Type<decltype(&ImmutableLambda::operator())>::type;
    yield(Fun_t{std::forward<ImmutableLambda>(c)});
}

和其他功能类似,

int main() {
    call_yield(
        [](char) -> void {}
    );
}

如何在上述对象中使用泛型对象的泛型类?我还没有使用过泛型。

3 个答案:

答案 0 :(得分:6)

如果您希望您的方法使用inputObject类的任何属性,则可以传递一个返回给定inputObject实例的必需属性的函数接口:

public <T> int function(inputObject input, Function<inputObject,T> func) {
    T obj = func.apply(input);
    PropertyUtils.setProperty(obj, input.getKey(), input.getValue());
    return 0;
}

现在您可以使用

调用此方法
function(input,inputObject::getLeadMaster);

function(input,inputObject::getDealMaster);

答案 1 :(得分:0)

您可以简单地将方法重新定义为:

public int function1(inputObject input, boolean lead){
    if(lead) {
         LeadMaster lead= input.getLeadMaster();  
         PropertyUtils.setProperty(lead, input.getKey(), input.getValue());    
    } else {
         DealMaster deal= input.getDealMaster();
         PropertyUtils.setProperty(deal, input.getKey(), input.getValue());
    }
    return 0;
}

答案 2 :(得分:0)

首先更改inputObject。 写方法 input.getMaster(Object object) input.setMaster(Object object),用于设置和获取通用对象。 您可以将LeadMasterDealMaster设置为一般。

编写一个抽象类或使用一个扩展到具有function1function2的类的超类。 在抽象或超类中使用您在inputObject

中定义的泛型方法
public int function(inputObject input){
    PropertyUtils.setProperty(input.getMaster, input.getKey(), input.getValue());
    return 0;
}