首页 文章 精选 留言 我的

精选列表

搜索[双向转换],共10000篇文章
优秀的个人博客,低调大师

scala中trait和abstract class在隐式转换中的区别

说半天还不如看一点代码更清楚问题之所在: object ImplicitObject3 { def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends SubTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends SubTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } trait Template[A] { def add(x:A,y:A):A } trait SubTemplate[A] extends Template[A] { def unit:A } 编译正确,执行时:在类加载器加载时出现异常。但是将二个trait放在object ImplicitObject3中,不管是放在main的前面还是后面都执行OK: object ImplicitObject3 { trait Template[A] { def add(x:A,y:A):A } trait SubTemplate[A] extends Template[A] { def unit:A } def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends SubTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends SubTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } 如果将二个trait改为abstract class形式,定义在object ImplicitObject3之外执行也OK: object ImplicitObject3 { def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends SubTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends SubTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } abstract class Template[A] { def add(x:A,y:A):A } abstract class SubTemplate[A] extends Template[A] { def unit:A } 为什么会有这样的现象,原因是什么呢??????????????????????? 当我在object ImplicitObject3外面定义二个trait之外,还在二个trait同级定义了一个继承自SubTemplate[A]的abstract class类,同时将main中二个implicit object继承的父改为这个抽象类,则一切都OK了。这种情况下,实验OK,其实原因好理解: object ImplicitObject3 { def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends abstractTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends abstractTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } trait Template[A] { def add(x:A,y:A):A } trait SubTemplate[A] extends Template[A] { def unit:A } abstract class abstractTemplate[A] extends SubTemplate[A] 有一次无意中,我将二个trait放在另一个单独的scala文件中,然后我编译工程然后调试,不成功。鬼使神差地在main的最开头import SubTemplate一次,居然成功了。我将磁盘上所有class文件都删除了再编译工程却又不成功。然后再去掉import,单独编译那个scala文件,再编译工程却又成功执行代码了。总结来看:这是由于IDEA造成class文件与源代码不一致的原因

优秀的个人博客,低调大师

Android 常用的地球经纬度转换公里(km)计算工具类

地球赤道上环绕地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的长度计算如下: 40075.04km/360°=111.31955km 111.31955km/60=1.8553258km=1855.3m 任意两点距离计算公式见代码: package org.wavefar.lib.utils; import android.content.Context; import com.baidu.location.BDAbstractLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.navi.BaiduMapAppNotSupportNaviException; import com.baidu.mapapi.navi.BaiduMapNavigation; import com.baidu.mapapi.navi.NaviParaOption; import com.baidu.mapapi.utils.poi.BaiduMapPoiSearch; import com.baidu.mapapi.utils.route.BaiduMapRoutePlan; import com.baidu.mapsdkplatform.comapi.location.CoordinateType; import org.wavefar.lib.utils.LogUtil; import org.wavefar.lib.utils.StringUtil; /** * 定位相关工具类 * @author summer */ public class LocationUtil { private LocationClient mLocationClient; private BDAbstractLocationListener mlistener; private Context context; // 地球半径 private final static double EARTH_RADIUS = 6378.137; public LocationUtil(Context context) { this.context = context; mLocationClient = new LocationClient(context.getApplicationContext()); LocationClientOption option = initLocationOption(); mLocationClient.setLocOption(option); LogUtil.d(LocationUtil.class.getSimpleName(), "当前定位库版本" + mLocationClient.getVersion()); } private LocationClientOption initLocationOption() { LocationClientOption option = new LocationClientOption(); // 设置定位模式 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 返回的定位结果是百度经纬度,默认值gcj02 option.setCoorType(CoordinateType.BD09LL); // 设置发起定位请求的间隔时间为5000ms option.setScanSpan(5000); // 返回的定位结果包含地址信息 option.setIsNeedAddress(true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIsNeedLocationPoiList(true); // 返回的定位结果包含手机机头的方向 option.setNeedDeviceDirect(true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationDescribe(true); option.setOpenGps(true); return option; } /** * 注册定位回调 * @param listener */ public void registerLocationListener(BDAbstractLocationListener listener) { mlistener = listener; if (mlistener != null) { mLocationClient.registerLocationListener(mlistener); } } /** * 启动定位 */ public void start() { if (mLocationClient.isStarted()) { return; } mLocationClient.start(); } /** * 重新定位 */ public void reStart() { if (mLocationClient.isStarted()) { return; } mLocationClient.restart(); } /** * 停止定位 */ public void stop() { if (mLocationClient.isStarted()) { mLocationClient.stop(); } } /** * 销毁定位 */ public void destroy() { if (mLocationClient != null) { mLocationClient.unRegisterLocationListener(mlistener); mLocationClient.stop(); mLocationClient = null; } } /** * 启动百度地图导航(Native),如果本地没有安装百度地图,调用WEBAPP * @param pt1 起点 * @param pt2 终点 */ public void startNavi(LatLng pt1, LatLng pt2) { // 构建 导航参数 NaviParaOption para = new NaviParaOption() .startPoint(pt1).endPoint(pt2); try { BaiduMapNavigation.openBaiduMapNavi(para, context); } catch (BaiduMapAppNotSupportNaviException e) { BaiduMapNavigation.openWebBaiduMapNavi(para, context); e.printStackTrace(); } } /** * 启动百度地图导航(Web) */ public void startWebNavi(LatLng pt1,LatLng pt2) { NaviParaOption para = new NaviParaOption() .startPoint(pt1).endPoint(pt2); BaiduMapNavigation.openWebBaiduMapNavi(para, context); } /** * 用完导航后需要调用该函数销毁 */ public void stopNavi() { try { BaiduMapNavigation.finish(context); BaiduMapRoutePlan.finish(context); BaiduMapPoiSearch.finish(context); } catch (Exception e) { e.printStackTrace(); } } private static double rad(double d) { return d * Math.PI / 180.0; } /** * 计算距离 返回单位km * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ public static double getDistance(double lat1, double lng1, double lat2, double lng2) { LogUtil.d("LocationUtil", "lat1:" + lat1 + "lng1:" + lng1 + "lat2:" + lat2 + "lng2:" + lng2); double radLat1 = rad(lat1); double radLat2 = rad(lat2); // 如果有一方等于零,直接返回0 if (radLat1 == 0 || radLat2 == 0) { return 0; } double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.round(s * 10000) / 10000; return s; } /** * 距离格式化 * * @param distance 以千米为单位 * @return */ public static String distanceKMFormat(double distance) { return distance > 1 ? (distance + "KM") : (distance * 1000 + "M"); } /** * 距离只保留两位小数 * @param distance 以米为单位 * @return */ public static String distanceFormat(double distance) { String str; double value = distance; if (distance >= 1000) { value = value / 1000; str = "KM"; } else { str = "M"; } return String.format("%s%s",StringUtil.formatDecimal(value,null),str); } } 以上代码定位依赖于百度定位API,所以粘贴以上代码之前,需要引入百度定位API,引入百度定位API不在这里介绍,自行去百度定位官方查看;

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册