当前位置:   article > 正文

Kotlin学习笔记(五) Java互操作

Kotlin学习笔记(五) Java互操作

Java互操作

一、Kotlin中调用Java
  • Getter和Setter
public class Person {
   
    private String name;
    private String gender;
    private int wage = 1000;

    public String getName() {
    return name; }

    public void setName(String name) {
    this.name = name; }

    public String getGender() {
    return gender; }

    public void setGender(String gender) {
    this.gender = gender; }

    public void setWage(int wage) {
    this.wage = wage; }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
fun main() {
   
    val person = Person()
    person.name = "yao"
    person.gender = "male"
    println(person.wage)
    // 无法访问,因为wage只有setter,它在Kotlin中不会作为属性可见。
    // Kotlin目前不支持只写属性。
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 返回void的方法

如果一个Java方法返回void,从Kotlin调用时返回Unit

val person = Person()
person.gender = "male"
println(person.setWage(100))  // kotlin.Unit
  • 1
  • 2
  • 3
  • 空安全

Java中声明的类型在Kotlin中称为平台类型。调用平台类型变量的方法时,Kotlin不会在编译时报告可空性错误,但运行时调用可能会失败。

val person = Person()
person.gender = "male"
println(person.name.substring(1))  // Exception
  • 1
  • 2
  • 3
  • 平台类型

T!表示T或者T?

(Mutable)Collection<T>!表示可以可变或不可变、可空或不可空的T的Java集合。

Array<(out) T>!表示可空或者不可空的T(或T的子类型)的Java数组。

  • 已映射类型

原生类型:

Java类型 Kotlin类型
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long kotlin.Long
char kotlin.Char
float kotlin.Float
double kotlin.Double
Boolean Kotlin.Boolean

非原生类型:

Java类型 Kotlin类型
java.lang.Object kotlin.Any!
java.lang.Cloneable kotlin.Cloneable!
java.lang.Comparable kotlin.Comparable!
java.lang.Enum kotlin.Enum!
java.lang.Annotation kotlin.Annotation!
java.lang.CharSequence kotlin.CharSequence!
java.lang.String kotlin.String!
java.lang.Number kotlin.Number!
java.lang.Throwable kotlin.Throwable!

装箱原始类型:

Java类型 Kotlin类型
java.lang.Byte kotlin.Byte?
java.lang.Short kotlin.Short?
java.lang.Integer kotlin.Int?
java.lang.Long kotlin.Long?
java.lang.Character kotlin.Char?
java.lang.Float kotlin.Float?
java.lang.Double kotlin.Double?
java.lang.Boolean Kotlin.Boolean?

集合类型:

Java类型 Kotlin只读类型 Kotlin可变类型 加载的平台类型
Iterator Iterator MutableIterator (Mutable)Iterator!
Iterable Iterable MutableIterable (Mutable)Iterable!
Collection Collection MutableCollection (Mutable)Collection!
Set Set MutableSet (Mutable)Set!
List List MutableList (Mutable)List!
ListIterator ListIterator MutableListIterator (Mutable)ListIterator!
Map<K, V> Map<K, V> MutableMap<K, V> (Mutable)Map<K, V>!
Map.Entry<K, V> Map.Entry<K, V> MutableMap.Entry<K, V> (Mutable)Map.(Mutable)Entry<K, V>!

数组类型

Java类型 Kotlin类型
int[] kotlin.IntArray!
String[] kotlin.Arrat<(out) String>!
  • Kotlin中的Java泛型

Foo<? extends Bar>转换成Foo<out Bar!>!

Foo<? super Bar>转换成Foo<in Bar!>!

List转换成List<*>!,即List<out Any?>!

Kotlin在运行时不保留泛型, Kotlin只允许is检测星投影的泛型类型:

if (a is List<Int>) // 错误:无法检测它是否真的是一个 Int 列表
if (a is List<*>)   // OK:不保证列表的内容
  • 1
  • 2
  • Java可变参数
public class JavaArrayExample {
   
    public void removeIndicesVarArg(int... indices) {
   
        // 在此编码……
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用展开运算符*来传递IntArray,无法传递null。

val javaObj &#
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/223367
    推荐阅读
    相关标签
      

    闽ICP备14008679号