如何将方法的返回类型声明为传递给方法的数组中最后一个lambda的返回类型

Yod*_*oda 6 java lambda java-8

我要求一些我认为不可能的东西,如果是的话,我会删除问题.

我有方法:

public Object convertBy(Function... functions) {
}
Run Code Online (Sandbox Code Playgroud)

这些功能是:

interface FLines extends Function {
    @Override
    default Object apply(Object t) {
        return null;
    };

    public List<String> getLines(String fileName);
}

interface Join extends Function {
    @Override
    default Object apply(Object t) {
        return null;
    };

    public String join(List<String> lines);//lines to join
}

interface CollectInts extends Function {
    @Override
    default Object apply(Object t) {
        return null;
    };

    public List<Integer> collectInts(String s);
}

interface Sum<T, R> extends Function<T, R> {
    @Override
    default Object apply(Object t) {
        return null;
    };

    public R sum(T list);//list of Integers
}
Run Code Online (Sandbox Code Playgroud)

这些接口中的抽象方法返回不同类型的值.我将lambdas传递给我的convertBy方法.

我想设置convertBy返回类型与返回类型相同functions[functions.length - 1].

这有可能吗?


编辑:

我已经改变了方法的签名和界面内方法的签名.它工作,但只有我在主要标记的位置投射在下面.它只需要在4个方法的调用中的3个中投射出奇怪的东西,我想在主要部分中完全摆脱强制转换.

import java.util.List;
import java.util.function.Function;


public class InputConverter<T> {

    private T value;

    public InputConverter(T value) {
        this.value = value;
    }


    public <T, R> R convertBy(Function<T, R> special, Function... functions) { 
        if (functions.length == 0) {
            FLines flines = (FLines) special;
            return (R) flines.getLines((value instanceof String) ? (String) value : null);
        } else if (functions.length == 1) {
            FLines flines = (FLines) functions[0];
            Join join = (Join) special;
            return (R) join.join(flines.getLines((String) value));
        } else if (functions.length == 2) {
            if (functions[0] instanceof FLines) {
                FLines flines = (FLines) functions[0];
                Join join = (Join) functions[1];
                CollectInts collectInts = (CollectInts) special;
                return (R) collectInts.collectInts(join.join(flines.getLines((String) value)));
            } else {
                Join join = (Join) functions[0];
                CollectInts collectInts = (CollectInts) functions[1];
                Sum sum = (Sum) special;
                return (R) sum.sum(collectInts.collectInts(join.join((List<String>) value)));
            }
        } else {
            FLines flines = (FLines) functions[0];
            Join join = (Join) functions[1];
            CollectInts collectInts = (CollectInts) functions[2];
            Sum sum = (Sum) special;
            return (R) sum.sum(collectInts.collectInts(join.join(flines.getLines((String) value))));
        }
    }

    /*  public Integer convertBy(Join join, CollectInts collectInts, Sum sum) {
            return sum.sum(collectInts.collectInts(join.join((List<String>) value)));
        }*/

}

interface FLines<T, R> extends Function {
    @Override
    default Object apply(Object t) {
        return null;
    };
    public R getLines(T fileName);
//  public List<String> getLines(String fileName);
}

interface Join<T,R> extends Function {
    @Override
    default Object apply(Object t) {
        return null;
    };
    public R join(T lines);//lines to join
//  public String join(List<String> lines);//lines to join
}

interface CollectInts<T, R> extends Function {
    @Override
    default Object apply(Object t) {
        return null;
    };
    public R collectInts(T t);
//  public List<Integer> collectInts(String s);
}

interface Sum<T, R> extends Function<T, R> {
    @Override
    default Object apply(Object t) {
        return null;
    };

    public R sum(T list);//list of Integers
}
Run Code Online (Sandbox Code Playgroud)

主要方法:

   FLines<String, List<String>> flines ....

  Join<List<String>, String> join ...
  CollectInts<String, List<Integer>> collectInts ...

    Sum<List<Integer>, Integer> sum ...

String fname =/* System.getProperty("user.home") + "/*/ "LamComFile.txt"; 
InputConverter<String> fileConv = new InputConverter<>(fname);
List<String> lines =  fileConv.convertBy(flines);//cannot cast from Object to List<String>
String text =  fileConv.convertBy( join, flines);//cannot cast from Object to String
List<Integer> ints =   fileConv.convertBy(collectInts,flines, join);//cannot cast from Object to List<Integer>
Integer sumints =  fileConv.convertBy(sum, flines, join, collectInts);//works without cast!
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器理解sum返回的内容但不推断实例collectInts返回的内容.

Kon*_*kov 2

您必须更改方法签名和内联最后一个 vararg 值作为单独的参数内

如果您将此参数作为最后一个参数,那么您将无法使用 vararg 参数,因为它始终是最后一个参数,并且必须表示为数组,以防它不是最后一个:

public <T, R> R convertBy(Function[] functions, Function<T, R> special) { }
Run Code Online (Sandbox Code Playgroud)

但是,如果您坚持使用可变参数,那么您可以将“特殊”移动Function为第一个参数:

public <T, R> R convertBy(Function<T, R> special, Function... functions) { }
Run Code Online (Sandbox Code Playgroud)