Java 8通用java.util.Function
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8通用java.util.Function,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2413字,纯文字阅读大概需要4分钟。
内容图文
![Java 8通用java.util.Function](/upload/InfoBanner/zyjiaocheng/665/9dd1091c9e4e4e9eaf85a7c0ebfcbf88.jpg)
我正在学习Java 8中提供的FunctionalInterface.在完成一些基本的Functional示例之后,我尝试对GenericType参数进行相同的操作.
public class Main {
public enum LocType {
Area, Country
}
public <T> Function<T, T> getCreateFunction(LocType type) {
AreaService areaService = new AreaService();
CountryService countryService = new CountryService();
switch(type) {
case Area : return areaService::createArea;
case Country : return countryService::createCountry;
default : return null;
}
}
}
public class AreaService {
public Area createArea(Area area) {
// some logic
return area;
}
}
public class CountryService {
public Country createCountry(Country country) {
// some logic
return country;
}
}
// Area & Country are Model Classes
但是Eclipse编译器抛出错误为
AreaService类型未定义适用于此处的createArea(T)
在FunctionalInterface ..中不能定义泛型类型参数吗?
解决方法:
您可以在此处将Class类用作类型标记. (我将忽略您发布的代码中的一些明显问题,例如无法调用新的AreaService()等).不用为您要函数创建(操纵?)的事物类型定义枚举,而应使用Class作为参数:
@SuppressWarnings("unchecked")
public <T> Function<T, T> getCreateFunction(Class<T> type) {
AreaService areaService = new AreaService();
CountryService countryService = new CountryService();
if (type == Area.class) {
return t -> (T) areaService.createArea((Area)t);
} else if (type == Country.class) {
return t -> (T) countryService.createCountry((Country)t);
}
return null ; // may be better to throw an IllegalArgumentException("Unsupported type")
}
现在您可以做诸如
Main main = new Main();
Function<Area, Area> areaChanger = main.getCreateFunction(Area.class);
Function<Country, Country> countryChanger = main.getCreateFunction(Country.class);
这种工作方式是任何类T的类文字T.class的类型为Class< T>.因此Area.class的类型为Class< Area>,Country.class的类型为Class< Country>.
因此,如果调用getCreateFunction(Area.class),则编译器可以推断该调用中T为Area,然后返回类型为Function< Area,Area>.另一方面,在getCreateFunction的实现中,尽管编译器只能推断出lambda的参数是未知类型T,但我们知道它T必须是由参数类型表示的类型;即,如果type == Area.class,我们可以安全地将t强制转换为Area,并将(areaService.createArea返回的值)强制转换为T.因此强制转换是安全的(甚至强制转换为未知类型T).
如果您想进一步限制可以传递给getCreateFunction(…)的值,则可以定义一个标记接口:公共接口Region {},并让Area和Country实施该接口.然后定义
public <T extends Region> Function<T,T> getCreateFunction(Class<T> type) {...}
并且仅对实现(或扩展了接口)Region的类传递类令牌是有效的.
内容总结
以上是互联网集市为您收集整理的Java 8通用java.util.Function全部内容,希望文章能够帮你解决Java 8通用java.util.Function所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。