将Xamarin项目转为Java版Android应用:'is'与'as'用法报错求助
从C#到Java:替代
is和as关键字的方案 嘿,我明白你在把Xamarin项目转Android Java时遇到的类型转换痛点了!C#里的is和as确实很方便,Java里虽然没有直接对应的关键字,但完全有等价的实现方式,我给你拆解一下:
1. 替代C#的is关键字:用instanceof
C#里的holder is MyView是用来检查holder是否是MyView类型(或其子类),Java里直接用instanceof关键字就能实现完全相同的效果。
C#原代码:
if (holder is MyView) { // 执行逻辑 }
转成Java后的代码:
if (holder instanceof MyView) { // 执行逻辑 }
注意:和C#的is一样,Java的instanceof对null的处理也是返回false,这点行为完全一致,不用担心空指针问题。
2. 替代C#的as关键字:instanceof + 强制转换
C#的as是尝试把对象转换成目标类型,失败时返回null而不抛出异常。Java里没有直接的as语法,但可以通过instanceof判断 + 强制转换的组合来实现安全转换:
C#原代码:
MyView myView = holder as MyView; if (myView != null) { // 操作myView }
转成Java后的代码:
// 写法一:分步判断转换 MyView myView = null; if (holder instanceof MyView) { myView = (MyView) holder; } // 写法二:用三元表达式简化 MyView myView = (holder instanceof MyView) ? (MyView) holder : null; if (myView != null) { // 操作myView }
如果不先做instanceof判断就直接强制转换,Java会抛出ClassCastException,所以一定要先检查类型再转换,这和C#as的安全特性完全对应。
结合你的场景示例
假设你原来的C#代码是这样的:
public void BindViewHolder(ViewHolder holder) { if (holder is MyView) { var myView = holder as MyView; myView.setText("Hello Java!"); } }
转成Java后就是:
public void bindViewHolder(ViewHolder holder) { if (holder instanceof MyView) { MyView myView = (MyView) holder; myView.setText("Hello Java!"); } }
这样就完美实现了和原C#代码一样的逻辑啦!
内容的提问来源于stack exchange,提问作者Alsong Dun Dunstan Philander
相关产品推荐
相关产品推荐

