nullable相关知识
-
谈谈Nullable&lt;T&gt;的类型转换问题本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。目录 一、四种典型的值类型转换方式 二、当类型转换遭遇Nullable<T> 三、将基于Nullable<T>的类型转换实现在扩展方法中 四、进一步完善扩展方法ConvertTo 五、谈谈NullableTypeConverter一、四种典型的类型转换方式对于类型转化,或者进一步地,对于像Int、Double、DateTime、String等这些原生类型之间的转化,我们具有四种典型的转换方式。如果类型之间不具有隐士转换关系存储,我们可以之间
-
第三章 UI动态加载布局 参考 View.inflate(Context context, @LayoutRes int resource, ViewGroup root) LayoutInflater.from(Context context).inflate(@LayoutRes int resource, @Nullable ViewGroup root) LayoutInflater.from(Context context).inflate(@LayoutRes int resource, @Nullable ViewGroup root, bool attachToRoot) 最终调用第三个方法 resource:要加载的布局文件; root:父布局容器; attachToRoot:表示是否把布局文件添加到容器中 RecyclerView和ListV
-
iOS UITableView/UICollectionView获取特定位置的cellUITableView/UICollectionView获取特定位置的cell 主要依赖于各自对象提供的的api方法,应用示例如下: // returns nil if point is outside of any row in the table //tableView - (nullable NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point; //collectionView - (nullable NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point; 一、tableView双级联动 以上两种效果比较类似,实现的关键在于都是需要获得在滑动过程中滑动到tableView顶部的cell的indexPath
-
解释LayoutInflater的inflate方法.第一次接触inflate方法是在使用ListView的getView()时. 当时只知道这么写, 并不知道为什么. LayoutInflate.from(getContext()).inflate(ID, parent, false); 想写一下为什么这么写的原因, 希望能帮到Android道路上的新手(如果有iOS和Android的问题, 欢迎加好友一起讨论). 这个inflate方法有四个重载, 分别是: // A public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) // B public View inflate(XmlPullParser parser, @Nullable ViewGroup r
nullable相关课程
nullable相关教程
- 3.1 拦截器接口规范 自定义拦截器之前,首先要了解 Spring MVC 提供的拦截器接口,自定义拦截器必须遵循此接口规范。public interface HandlerInterceptor { /** * 用户控制器之前拦截,实现用户控制器数据的预处理工作,第三个参数为响应的用户控制器 */ default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** *对用户控制器处理后的数据再进一步处理 */ default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } /** * 视图解析器对 View 渲染完成后对最后结果进行处理 */ default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { }}Spring MVC 提供有拦截器适配器,适配器对拦截器接口做了简单封装。public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor{ //……}
- 2.3 MultipartFile 接口 以字节数组的方式接收上传的文件数据,过于原始、低级,很难获取到文件的元数据。Spring MVC 提供有 MultipartFile 接口。查看 MultipartFile 接口源代码,可以知道 MultipartFile 接口提供了很多方法,能解析出上传文件的更多元数据,包括文件名、文件大小等,方便开发者更灵活地处理数据。public interface MultipartFile extends InputStreamSource { String getName(); @Nullable String getOriginalFilename(); @Nullable String getContentType(); boolean isEmpty(); long getSize(); byte[] getBytes() throws IOException; @Override InputStream getInputStream() throws IOException; default Resource getResource() { return new MultipartFileResource(this); } void transferTo(File dest) throws IOException, IllegalStateException; default void transferTo(Path dest) throws IOException, IllegalStateException { FileCopyUtils.copy(getInputStream(), Files.newOutputStream(dest)); }}MultipartFile 最常用的是 transferTo 方法,用来把上传文件存储到指定位置。重构上面的控制器代码。 @RequestMapping("/upload") public String upload(@RequestPart("upFile") MultipartFile file) throws IOException { String path = System.getProperty("webapp.root"); String filePath = path + "\\upload\\"+file.getOriginalFilename(); System.out.println(filePath); file.transferTo(new File(filePath)); return "success"; }如上面一样测试文件上传,结果没有什么不一样。
- 5. @JvmOverloads @JvmOverloads 的作用指导 Kotlin 编译器为带默认参数值的函数(包括构造函数)生成多个重载函数。源码定义//作用对象是函数和构造函数@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR)@MustBeDocumented@OptionalExpectationpublic expect annotation class JvmOverloads()注解使用该注解使用最多就是用于带默认值函数的重载,在 Android 中我们在自定义 View 的时候一般会重载多个构造器,需要加入该注解,如果不加默认只定义一个构造器,那么当你直接在 XML 使用这个自定义 View 的时候会抛出异常。class ScrollerView @JvmOverloads constructor( context: Context, attr: AttributeSet? = null, defStyle: Int = 0) : View(context, attr, defStyle) { //...}反编译后的 Java 代码public final class ScrollerView extends View { @JvmOverloads public ScrollerView(@NotNull Context context, @Nullable AttributeSet attr, int defStyle) { Intrinsics.checkParameterIsNotNull(context, "context"); super(context, attr, defStyle); } // $FF: synthetic method @JvmOverloads public ScrollerView(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) { if ((var4 & 2) != 0) { var2 = (AttributeSet)null; } if ((var4 & 4) != 0) { var3 = 0; } this(var1, var2, var3); } @JvmOverloads public ScrollerView(@NotNull Context context, @Nullable AttributeSet attr) { this(context, attr, 0, 4, (DefaultConstructorMarker)null); } @JvmOverloads public ScrollerView(@NotNull Context context) { this(context, (AttributeSet)null, 0, 6, (DefaultConstructorMarker)null); } //...}
- 4.3 代码反编译分析 为了好反编译分析单独把库中的那个函数拷出来取了 startActivityKt 名字便于分析。class SplashActivity : BizActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.biz_app_activity_welcome) startActivityKt<AccountActivity>()//只需这样就直接启动了AccountActivity了,指明了类型形参上界约束Activity }}inline fun <reified T : Activity> Context.startActivityKt(vararg params: Pair<String, Any?>) = AnkoInternals.internalStartActivity(this, T::class.java, params)编译后关键代码://函数定义反编译 private static final void startActivityKt(@NotNull Context $receiver, Pair... params) { Intrinsics.reifiedOperationMarker(4, "T"); AnkoInternals.internalStartActivity($receiver, Activity.class, params);//注意点一: 由于泛型擦除的影响,编译后原来传入类型实参AccountActivity被它形参上界约束Activity替换了,所以这里证明了我们之前的分析。 }//函数调用点反编译protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(2131361821); Pair[] params$iv = new Pair[0]; AnkoInternals.internalStartActivity(this, AccountActivity.class, params$iv); //注意点二: 可以看到这里函数调用并不是简单函数调用,而是根据此次调用明确的类型实参AccountActivity.class替换定义处的Activity.class,然后生成新的字节码插入到调用点。}在函数加点输出就会更加清晰:class SplashActivity : BizActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.biz_app_activity_welcome) startActivityKt<AccountActivity>() }}inline fun <reified T : Activity> Context.startActivityKt(vararg params: Pair<String, Any?>) { println("call before") AnkoInternals.internalStartActivity(this, T::class.java, params) println("call after")}反编译后:private static final void startActivityKt(@NotNull Context $receiver, Pair... params) { String var3 = "call before"; System.out.println(var3); Intrinsics.reifiedOperationMarker(4, "T"); AnkoInternals.internalStartActivity($receiver, Activity.class, params); var3 = "call after"; System.out.println(var3); } protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(2131361821); Pair[] params$iv = new Pair[0]; String var4 = "call before"; System.out.println(var4); AnkoInternals.internalStartActivity(this, AccountActivity.class, params$iv);//替换成确切的类型实参AccountActivity.class var4 = "call after"; System.out.println(var4); }
- 4.1 typealias 用于多数通用场景 // Classes and Interfaces (类和接口)typealias RegularExpression = Stringtypealias IntentData = Parcelable// Nullable types (可空类型)typealias MaybeString = String?// Generics with Type Parameters (类型参数泛型)typealias MultivaluedMap<K, V> = HashMap<K, List<V>>typealias Lookup<T> = HashMap<T, T>// Generics with Concrete Type Arguments (混合类型参数泛型)typealias Users = ArrayList<User>// Type Projections (类型投影)typealias Strings = Array<out String>typealias OutArray<T> = Array<out T>typealias AnyIterable = Iterable<*>// Objects (including Companion Objects) (对象,包括伴生对象)typealias RegexUtil = Regex.Companion// Function Types (函数类型)typealias ClickHandler = (View) -> Unit// Lambda with Receiver (带接收者的Lambda)typealias IntentInitializer = Intent.() -> Unit// Nested Classes and Interfaces (嵌套类和接口)typealias NotificationBuilder = NotificationCompat.Buildertypealias OnPermissionResult = ActivityCompat.OnRequestPermissionsResultCallback// Enums (枚举类)typealias Direction = kotlin.io.FileWalkDirection// (but you cannot alias a single enum *entry*)// Annotation (注解)typealias Multifile = JvmMultifileClass
- 2.1 Model 这个字面意思很明显,咱就是一个模型组件。Model 是一个接口类型,Model 接口中提供了标准的保存数据的方法。Model addAttribute(String attributeName, @Nullable Object attributeValue);Model 使用起来很简单,将 Model 设为控制器方法的参数便可 ,其它的交给 Spring MVC,因为 Model 是一个接口类型,Spring MVC 会为我们辨明身份,注入一个具体的实例对象。@RequestMapping(value="/login",method=RequestMethod.POST)public String login01(User user,Model map) { if("mk".equals(user.getUserName()) && "123".equals(user.getUserPassword())) { map.addAttribute("loginUser", user); return "index"; } return "fail";}Model 接口中还有其它的方法,但都不常用,感兴趣的话大家可以查阅其源代码或 API 文档。
nullable相关搜索
-
net core
net mvc
net教程
net开发
name
navigate
navigationbar
navigator
navigator appname
navigator useragent
nba比赛结果
negatives
neicun
neon
net link
net mvc
netcore
netscape
netstat
netstat命令