[英]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
东西,例如Collection
或Optional
)作为附加的方法参数。
如果您不需要调用someFunction.apply
(问题是为什么您需要它...),则可以删除S
类型变量,而只需使用:
public <R> void someMethod(Function<? extends SomeInterface<R>, R> someFunction)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.