2017-06-09 38 views
19

new không phải là từ khóa trong kotlin, tôi có thể có chức năng sau trong kotlin.Gọi hàm kotlin là từ khóa trong java từ java?

fun new(): String { 
    return "just returns some string" 
} 

Nhưng tôi không thể gọi chức năng này từ java vì new là từ khóa trong java. Tôi muốn biết nếu có một số bí danh cho chức năng này trong lĩnh vực java. Tôi không tìm thấy bất kỳ gợi ý intellij nào có thể là một bí danh có thể có cho chức năng này.

Sửa 1:

Tôi đã viết đoạn mã sau vào Kotlin:

fun new(): String { 
    return "just returns some string" 
} 

fun main(args:Array<String>){ 
    new() 
} 

Và tôi đã có một cái nhìn tại các bytecode java. Nó như sau.

// ================MainKt.class ================= 
// class version 50.0 (50) 
// access flags 0x31 
public final class MainKt { 


    // access flags 0x19 
    public final static new()Ljava/lang/String; 
    @Lorg/jetbrains/annotations/NotNull;() // invisible 
    L0 
    LINENUMBER 2 L0 
    LDC "just returns some string" 
    ARETURN 
    L1 
    MAXSTACK = 1 
    MAXLOCALS = 0 

    // access flags 0x19 
    public final static main([Ljava/lang/String;)V 
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 
    L0 
    ALOAD 0 
    LDC "args" 
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V 
    L1 
    LINENUMBER 6 L1 
    INVOKESTATIC MainKt.new()Ljava/lang/String; 
    POP 
    L2 
    LINENUMBER 7 L2 
    RETURN 
    L3 
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0 
    MAXSTACK = 2 
    MAXLOCALS = 1 

    @Lkotlin/Metadata;(mv={1, 1, 6}, bv={1, 0, 1}, k=2, d1={"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\u0008\u0003\u001a\u0019\u0010\u0000\u001a\u00020\u00012\u000c\u0010\u0002\u001a\u0008\u0012\u0004\u0012\u00020\u00040\u0003\u00a2\u0006\u0002\u0010\u0005\u001a\u0006\u0010\u0006\u001a\u00020\u0004\u00a8\u0006\u0007"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "new", "production sources for module Srinivas"}) 
    // compiled from: Main.kt 
} 


// ================META-INF/production sources for module Srinivas.kotlin_module ================= 



MainKt 

Và đây là bytecode decompiled để java:

import kotlin.Metadata; 
import kotlin.jvm.internal.Intrinsics; 
import org.jetbrains.annotations.NotNull; 

@Metadata(
    mv = {1, 1, 6}, 
    bv = {1, 0, 1}, 
    k = 2, 
    d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0003\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005\u001a\u0006\u0010\u0006\u001a\u00020\u0004¨\u0006\u0007"}, 
    d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "new", "production sources for module Srinivas"} 
) 
public final class MainKt { 
    @NotNull 
    public static final String new() { 
     return "just returns some string"; 
    } 

    public static final void main(@NotNull String[] args) { 
     Intrinsics.checkParameterIsNotNull(args, "args"); 
     new(); 
    } 
} 

Dường như viết một hàm có tên mới là một bytecode java hợp lệ. Nhưng javac không cho phép tôi biên dịch mã. Có một số chú thích hoặc biên dịch cờ tôi có thể kích hoạt để có được javac để biên dịch các tập tin java với các cuộc gọi đến chức năng này.

+0

Nếu bạn không sở hữu nguồn Kotlin trong câu hỏi, phản ánh có thể làm việc – Daenyth

+1

Trong trường hợp đó một utility.kt với bí danh như đã đề cập trong câu trả lời pelochos sẽ làm việc . Xem dưới dạng phản chiếu sẽ chậm hơn – Srin

+1

Ý tưởng liên quan: https://stackoverflow.com/questions/30491035/can-java-class-files-use-reserved-keywords-as-names – Nayuki

Trả lời

3

Vì bạn đang cố gắng sử dụng một từ khóa trình biên dịch sẽ không cho phép bạn sử dụng nó làm tên phương thức

Cách giải quyết duy nhất tôi có thể nghĩ là làm điều gì đó như:

fun new(): String { 
    return "just returns some string" 
} 

fun notAKeyWord() = new() 

Vì vậy, bạn có thể sử dụng WhatEverKt.notAKeyWord() từ mã java của bạn

34

Đối với các loại vấn đề này, bạn có thể sử dụng chú thích @JvmName.

@JvmName("neww") 
fun new(): String { 
    return "just returns some string" 
} 

Tên bạn vượt qua nó sẽ là tên mà bạn có thể sử dụng để tham khảo phương pháp này từ Java:

String s = something.neww(); 

Nói chung, bạn có lẽ tốt hơn không sử dụng từ khóa Java như Số nhận dạng Kotlin nếu bạn cần phải tương tác với mã Java.

+6

Chỉ cần hỏi câu hỏi này vì mục đích thông tin. Sẽ không viết mã như thế này. – Srin

11

Bạn có thể sử dụng @JvmName để cung cấp một tên khác cho chức năng của bạn được gọi là hình thức Java:

@JvmName("myNew") 
fun new(): String { 
    return "just returns some string" 
} 

Và việc sử dụng trong Java:

String bar = foo.myNew();