-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


Kotlin, ( 1)

, 02 2017 . 13:09 +


Kotlin ( c Google IO 17), , Kotlin.
JVM.

.

: Caught in the Act: Kotlin Bytecode Generation and Runtime Performance. . , . . .

:



Primary
data

Not-null
(extension functions)




, , , :




kotlinc , kotlin, java. Java Kotlin, . Java, , Kotlin. *.class java *.java. java , jar ( ).

Kotlin, Intellij IDEA Tools -> Kotlin -> Show Kotlin Bytecode. , *.kt, . , Java, Java Decompile.



*.class kotlin, @Metadata:

@Metadata(
   mv = {1, 1, 6},
   bv = {1, 0, 1},
   k = 1,
   d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0003\u0018\u00002\u00020\u0001B\u0005c\u0006\u0002\u0010\u0002R\u0014\u0010\u0003\u001a\u00020\u0004X\u0086Dc\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006"\u0006\u0007"},
   d2 = {"LSimpleKotlinClass;", "", "()V", "test", "", "getTest", "()I", "production sources for module KotlinTest_main"}
)


, Kotlin, Java . , nullable .. , , Reflection API. Protobuf c .


, , . Java:



: .

//Kotlin,  Example1.kt
fun foo() { }

Java . .

//Java
public final class Example1Kt {
   public static final void foo() {
   }
}


*Kt ( Example1Kt). file:JvmName:

//Kotlin
@file:JvmName("Utils")
fun foo() { }

//Java
public final class Utils {
   public static final void foo() {
   }
}


Primary



Kotlin (property).

//Kotlin
class A(val x: Int, val y: Long) {}

, , , , , . getter, . :

//Java
public final class A {
   private final int x;
   private final long y;
 
   public final int getX() {
      return this.x;
   }
 
   public final long getY() {
      return this.y;
   }
 
   public A(int x, long y) {
      this.x = x;
      this.y = y;
   }
}

A x val var, setter. , A final public. Kotlin final public.

data



Kotlin data.

//Kotlin
data class B(val x: Int, val y: Long) { }

, equals, hashCode, toString, copy componentN . , destructing . :

//Java
public final class B {
   // ---   2   
 
   public final int component1() {
      return this.x;
   }
 
   public final long component2() {
      return this.y;
   }
 
   @NotNull
   public final B copy(int x, long y) {
      return new B(x, y);
   }
 
    public String toString() {
      return "B(x=" + this.x + ", y=" + this.y + ")";
   }
 
   public int hashCode() {
      return this.x * 31 + (int)(this.y ^ this.y >>> 32);
   }
 
   public boolean equals(Object var1) {
      if(this != var1) {
         if(var1 instanceof B) {
            B var2 = (B)var1;
            if(this.x == var2.x && this.y == var2.y) {
               return true;
            }
         }
 
         return false;
      } else {
         return true;
      }
 }

data , , , . data .



.

//Kotlin
class C {
    var x: String? = null
}

x String, null. @Nullable:

//Java
import org.jetbrains.annotations.Nullable;

public final class C {
   @Nullable
   private String x;
 
   @Nullable
   public final String getX() {
      return this.x;
   }
 
   public final void setX(@Nullable String var1) {
      this.x = var1;
   }
}


getter, setter ( var). @Nullable , , , - .

getter setter, , @JvmField:

//Kotlin
class C {
    @JvmField var x: String? = null
}

Java :

//Java
public final class C {
   @JvmField
   @Nullable
   public String x;
}


Not-null



Kotlin , public private . , not-null .

//Kotlin
class E {
    fun x(s: String) {
        println(s)
    }
 
    private fun y(s: String) {
        println(s)
    }
}

s String, null.

//Java
import kotlin.jvm.internal.Intrinsics;

public final class E {
   public final void x(@NotNull String s) {
      Intrinsics.checkParameterIsNotNull(s, "s");
      System.out.println(s);
   }
 
   private final void y(String s) {
      System.out.println(s);
   }
}

(Intrinsics.checkParameterIsNotNull), null. , Java. null, , . . . Java , reflection. reflection . Kotlin null .

, , . , . , :

null




NotNull . , , null, - . ( 3 ) . , , . , kotlinc: -Xno-param-assertions -Xno-call-assertions (!: , , , , )

(extension functions)



Kotlin API , Kotlin, Java. , .

//Kotlin ( Example6.kt)
class T(val i: Int)
 
fun T.foo(): Int {
	return i
}
 
fun useFoo() {
	T(1).foo()
}

Java , , . . , , , .

//Java
public final class Example6Kt {
   public static final int foo(@NotNull T $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      return $receiver.getI();
   }
 
   public static final void useFoo() {
      foo(new T(1));
   }
}

Kotlin JDK. Kotlin . , listOf, setOf, mapOf, Kotlin , Java ArrayList, HashSet, HashMap. ( ), ( Scala <-> Java) .



Kotlin .

//Kotlin
interface I {
    fun foo(): Int {
        return 42
    }
}
 
class D : I {  }

Java 8 , , Kotlin Java 6, Java :

public interface I {
   int foo();
 
   public static final class DefaultImpls {
      public static int foo(I $this) {
         return 42;
      }
   }
}

public final class D implements I {
   public int foo() {
      return I.DefaultImpls.foo(this);
   }
}

Java , , DefaultImpls . , .

Kotlin (default method) Java 8, . youtrack. , api Java, .



Java, Kotlin . .

//Kotlin ( Example8.kt)
fun first(x: Int = 11, y: Long = 22) {
    println(x)
    println(y)
}
 
fun second() {
    first()
}

Java , mask , .

//Java
public final class Example8Kt {
   public static final void first(int x, long y) {
      System.out.println(x);
      System.out.println(y);
   }
 
   public static void first$default(int var0, long var1, int mask, Object var4) {
      if((mask & 1) != 0) {
         var0 = 11;
      }
 
      if((mask & 2) != 0) {
         var1 = 22L;
      }
 
      first(var0, var1);
   }
 
   public static final void second() {
      first$default(0, 0L, 3, (Object)null);
   }
}

, var4? , null. , yole .

:




. . Kotlin . @JvmOverloads:

//Kotlin
@JvmOverloads
fun first(x: Int = 11, y: Long = 22) {
    println(x)
    println(y)
}

, , first .

//Java
public final class Example8Kt {
   //--  first, second, first$default   
 
   @JvmOverloads
   public static final void first(int x) {
      first$default(x, 0L, 2, (Object)null);
   }
 
   @JvmOverloads
   public static final void first() {
      first$default(0, 0L, 3, (Object)null);
   }
}




Kotlin Java ( )

//Kotlin ( Lambda1.kt)
fun  runLambda(x: ()-> T): T = x()

runLambda Function0 ( Kotlin), invoke(). , Java 8, , , SAM- Java. :

//Java
public final class Lambda1Kt {
   public static final Object runLambda(@NotNull Function0 x) {
      Intrinsics.checkParameterIsNotNull(x, "x");
      return x.invoke();
   }
}

, . , value , .

//Kotlin ( Lambda2.kt)
var value = 0
 
fun noncapLambda(): Int = runLambda { value }

Java , , . . , Function0, , , .

//Java
final class Lambda2Kt$noncapLambda$1 extends Lambda implements Function0 {
   public static final Lambda2Kt$noncapLambda$1 INSTANCE = new Lambda2Kt$noncapLambda$1()
 
  public final int invoke() {
    return Lambda2Kt.getValue();
  }
}

public final class Lambda2Kt {
   private static int value;
 
   public static final int getValue() {
      return value;
   }
 
   public static final void setValue(int var0) {
      value = var0;
   }
 
   public static final int noncapLambda() {
      return ((Number)Lambda1Kt.runLambda(Lambda2Kt$noncapLambda$1.INSTANCE)).intValue();
   }
 
}

.

//Kotlin ( Lambda3.kt)
fun capturingLambda(v: Int): Int = runLambda { v }

, .

//Java
public static final int capturingLambda(int v) {
      return ((Number)Lambda1Kt.runLambda((Function0)(new Function0() {
          public Object invoke() {
            return Integer.valueOf(this.invoke());
         }
 
         public final int invoke() {
            return v;
         }
      }))).intValue();
 }

Kotlin ( Java).

//Kotlin ( Lambda4.kt)
fun mutatingLambda(): Int {
    var x = 0
    runLambda { x++ }
    return x
}

. , , , .

public final class Lambda4Kt {
   public static final int mutatingLambda() {
      final IntRef x = new IntRef();
      x.element = 0;
      Lambda1Kt.runLambda((Function0)(new Function0() {
         public Object invoke() {
            return Integer.valueOf(this.invoke());
         }
 
         public final int invoke() {
            int var1 = x.element++;
            return var1;
         }
      }));
      return x.element;
   }
}

Kotlin, Java:




, ( ) , , , Java , , . .

Kotlin (method reference) , , , , . , . , .

Kotlin : inline. . JIT , , , . .

//Kotin ( Lambda5.kt)
fun inlineLambda(x: Int): Int = run { x }
 
//run     :
public inline fun  run(block: () -> R): R = block()

//Java
public final class Lambda5Kt {
   public static final int inlineLambda(int x) {
      return x;
   }
}

, . , . filter, map .. synchronized .

2

!
. , - , .
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330060/

:  

: [1] []
 

:
: 

: ( )

:

  URL