繁体   English   中英

Java泛型:在方法调用中使用参数化接口

[英]Java Generics: using parameterized interface in method calls

我想存储一个要应用于类的任何实例的函数。 因为我想对不同的类执行此操作,所以我在存储和应用代码时使用了接口。 但是我的类型变量有一些问题:

我有一个界面

public interface SomeInterface<P>

还有一个实施班

public class SomeClass implements SomeInterface<Object>

以及处理者

public class SomeHandler {
   public <R> void someMethod(Function<SomeInterface<R>,R> someFunction) {}
}

和代码

public void someTest() {
    Function<SomeClass,Object> someFunction = a -> new Object();
    SomeHandler handler = new SomeHandler();
    handler.someMethod(someFunction); //error here
}

不管用。

标记位置的错误是“不存在类型变量R的实例,因此SomeClass符合SomeInterface”

我已经尝试使用抽象类而不是接口。 这也不起作用。

我做了一些研究,发现一个包含lambda-expressions的错误。 删除lambda表达式不能解决问题。 另一页提示OpenJdk中的错误,建议更改类型变量的顺序。 当我使用java Function类时,无法执行此操作。

我也尝试获取Oracle Jdk,但不允许在此计算机上执行任何操作。

任何想法都欢迎!

someTest()的函数更改为:

Function<SomeInterface<Object>, Object> someFunction = a -> new Object();

更新取决于您的评论:

您可以将处理程序方法推广为更多此类:

public <R> void someMethod(Function<? extends SomeInterface<R>, R> someFunction) {}

这使您可以将类似于以下的内容用作功能:

Function<SomeOtherClass, MyObject> someFunction = a -> new MyObject();
Function<SomeClass,Object> someFunction = a -> new Object();

不是Function<SomeInterface<R>,R>的实例。

您可以执行Georg Henkel的建议 :更改someFunction变量的类型。 或者您可以在方法调用中内联lambda并隐藏类型声明:

handler.someMethod(a -> new Object());

或者,要将现有类型保留在调用站点,请将方法签名更改为:

public <R, S extends SomeInterface<R>>
    void someMethod(Function<S, R> someFunction)

但是请注意,为了能够使用非null任何null调用someFunction.apply ,您将必须传入S (或包含S东西,例如CollectionOptional )作为附加的方法参数。

如果您不需要调用someFunction.apply (问题是为什么您需要它...),则可以删除S类型变量,而只需使用:

public <R> void someMethod(Function<? extends SomeInterface<R>, R> someFunction)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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