总是会遇到一些奇怪的kotlin代码不太会写,所以记录下.
1.kotlin实现InvocationHandler中的invoke函数
java
代码:
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(mBase, args);
}
使用自动转换kotlin
代码为:
override fun invoke(proxy: Any?, method: Method?, args: Array<Any>?): Any? {
return method.invoke(mBase, args)
}
这时kotlin
的代码是有问题的,传入的args
会被可变参数识别成一个参数。
需要使用*args
把args
展开成变长参数,修饰符 *叫做Speread Operator
。 它只支持展开Array
数组, 不支持List
集合,仅用于变长参数列表的实参。
正确代码如下:
override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
return method?.invoke(mBase, *(args ?: emptyArray()))
}
2.kotlin实现while循环判断
java
代码:
int count = 0;
while ((count = input.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
使用自动转换kotlin
代码为:
var count = 0
while ((count = input.read(buffer)) > 0) {
fos.write(buffer, 0, count)
}
这时kotlin
的代码会提示错误:Assignments are not expressions, and only expressions are allowed in this context
正确代码如下:
var count = 0
while ({ count = input.read(buffer); count }() > 0) {
fos.write(buffer, 0, count)
}
2.kotlin的ArrayList转成java的String[]数组传参
java
代码:
参数是String[]
public static void requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) {
这时kotlin
可以直接用 arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
这种方式传入,但如果是 arrayListOf<String>
变量,直接使用toArray()
来转换是会报错的,正确代码如下:
private var mPermissionList = arrayListOf<String>()
...
val array = arrayOfNulls<String>(mPermissionList.size)
mPermissionList.toArray(array)
ActivityCompat.requestPermissions(
this,
array,
REQUEST_PERMISSION_CODE
)