জাভা থেকে কোটলিন এক্সটেনশন ফাংশন অ্যাক্সেস করা


156

জাভা কোড থেকে এক্সটেনশন ফাংশন অ্যাক্সেস করা সম্ভব?

আমি কোনও কোটলিন ফাইলটিতে এক্সটেনশন ফাংশনটি সংজ্ঞায়িত করেছি।

package com.test.extensions

import com.test.model.MyModel

/**
 *
 */
public fun MyModel.bar(): Int {
    return this.name.length()
}

যেখানে MyModelএকটি (উত্পন্ন) জাভা ক্লাস। এখন, আমি এটি আমার সাধারণ জাভা কোডটিতে অ্যাক্সেস করতে চেয়েছি:

MyModel model = new MyModel();
model.bar();

তবে, এটি কাজ করে না। আইডিই bar()পদ্ধতিটি সনাক্ত করতে পারে না এবং সংকলন ব্যর্থ হয়।

কোটলিনের স্থির ফাংশন সহ কী কাজ করে:

public fun bar(): Int {
   return 2*2
}

import com.test.extensions.ExtensionsPackageসুতরাং ব্যবহার করে আমার IDE সঠিকভাবে কনফিগার করা আছে বলে মনে হচ্ছে।

আমি কোটলিন ডক্স থেকে পুরো জাভা-ইন্টারপ ফাইলটি অনুসন্ধান করেছি এবং অনেকগুলি গুগলও করেছি, তবে এটি খুঁজে পেলাম না।

আমি কি ভুল করছি? এটা কি সম্ভব?


দয়া করে বিস্তারিত কাজ করে না ? এটি কি সংকলন করে, একটি ব্যতিক্রম ছুঁড়ে ফেলেছে বা কী করে? আপনারও আছে import package com.test.extensions.MyModel?
মেসকোবালাজ

@ মেস্কোবালাজরা আমার সম্পাদিত উত্তরটি দেখুন।
লভিস

@ মেস্কোবালাজ, আমি এটিকে আমদানিও করতে পারি না। আমি কেবল আমদানি করতে পারিcom.test.extensions.ExtensionsPackage
লভিস

উত্তর:


230

কোনও ফাইলের মধ্যে ঘোষিত সমস্ত কোটলিন ফাংশন ডিফল্টরূপে একই প্যাকেজের মধ্যে একটি ক্লাসে স্থির পদ্ধতিতে এবং কোটলিন উত্স ফাইল থেকে প্রাপ্ত নামের সাথে সংকলিত হবে (প্রথম বর্ণের মূলধন এবং "। কেটি" এক্সটেনশন "কেটি" প্রত্যয় দিয়ে প্রতিস্থাপিত হবে ) । এক্সটেনশন ফাংশনগুলির জন্য উত্পন্ন পদ্ধতিগুলির এক্সটেনশন ফাংশন রিসিভার ধরণের সাথে একটি অতিরিক্ত প্রথম প্যারামিটার থাকবে।

মূল প্রশ্ন তা প্রয়োগ করা হচ্ছে, জাভা কম্পাইলার নামের সঙ্গে Kotlin সোর্স ফাইল দেখতে হবে example.kt

package com.test.extensions

public fun MyModel.bar(): Int { /* actual code */ }

যেন নীচের জাভা ক্লাস ঘোষণা করা হয়েছিল

package com.test.extensions

class ExampleKt {
    public static int bar(MyModel receiver) { /* actual code */ }
}

জাভা দৃষ্টিকোণ থেকে বর্ধিত শ্রেণীর সাথে যেমন কিছু না ঘটে, আপনি এ জাতীয় পদ্ধতিতে অ্যাক্সেসের জন্য কেবল বিন্দু-বাক্য গঠন ব্যবহার করতে পারবেন না। তবে এগুলি এখনও সাধারণ জাভা স্ট্যাটিক পদ্ধতি হিসাবে কলযোগ্য:

import com.test.extensions.ExampleKt;

MyModel model = new MyModel();
ExampleKt.bar(model);

স্ট্যাটিক আমদানি উদাহরণ কেটি শ্রেণীর জন্য ব্যবহার করা যেতে পারে:

import static com.test.extensions.ExampleKt.*;

MyModel model = new MyModel();
bar(model);

1
আমি বুঝতে পেরেছি, এর অর্থ আমি স্ট্যাটিক ফাংশন না লিখলে কোটলিন থেকে জাভাতে এক্সটেনশন ব্যবহার করতে পারি না?
আবদুলমোমেন عبدالمؤمن

11
জেএফওয়াইআই, আপনি ক্লাসের নামটিও @ ফাইল দিয়ে পরিবর্তন করতে পারেন: জেভিএমনেম ("<TheNameThatYouWant> Utils")।
crgarridos

3
আমি যদি পরামিতিগুলির সাথে একটি এক্সটেনশন তৈরি করি?
আমিরজি

3
@ আমিরজি পরামিতিগুলি উদাহরণটি অনুসরণ করবে। এই ক্ষেত্রে এটি হবেbar(model, param1, param2);
টিম

এটি সত্যিই একটি দ্রুত সহায়তা ছিল, অনেক অনেক ধন্যবাদ
বিবেক গুপ্ত

31

কোটলিন শীর্ষ স্তরের এক্সটেনশন ফাংশনটি জাভা স্ট্যাটিক পদ্ধতি হিসাবে সংকলিত।

কোটলিন ফাইলযুক্ত Extensions.ktপ্যাকেজে ফাইলগুলি foo.bar:

fun String.bar(): Int {
    ...
}

সমতুল্য জাভা কোডটি হবে:

package foo.bar;

class ExtensionsKt {
    public static int bar(String receiver) { 
        ...
    }
}

যতক্ষণ না, এটিতে Extensions.ktলাইন থাকে

@file:JvmName("DemoUtils")

যা ক্ষেত্রে জাভা স্থিত শ্রেণীর নামকরণ করা হবে DemoUtils

কোটলিনে, এক্সটেনশন পদ্ধতিগুলি অন্যান্য উপায়ে ঘোষণা করা যেতে পারে। (উদাহরণস্বরূপ, সদস্য ফাংশন হিসাবে বা কোনও সহকর্মী অবজেক্টের এক্সটেনশন হিসাবে))


8

নাম্বার ফর্ম্যাটিং.কেটি নামে আমার একটি কোটলিন ফাইল রয়েছে যার নীচের ফাংশন রয়েছে

fun Double.formattedFuelAmountString(): String? {
    val format = NumberFormat.getNumberInstance()
    format.minimumFractionDigits = 2
    format.maximumFractionDigits = 2
    val string = format.format(this)
    return string
}

জাভাতে আমি এটি প্রয়োজনীয় আমদানির পরে নিম্নলিখিত পদ্ধতিতে ফাইল নাম্বার ফর্ম্যাটকিটি ফাইলের মাধ্যমে সহজেই অ্যাক্সেস করিimport ....extensions.NumberFormattingKt;

String literString = NumberFormattingKt.formattedFuelAmountString(item.getAmount());

6

আপনি সর্বদা আসল জাভা কোডটি দেখতে পাচ্ছেন যা গিয়ে আপনার কোটলিন কোড থেকে উত্পন্ন হচ্ছে Tools > Kotlin > Show Kotlin Bytecode, তারপরে ক্লিক করে Decompile। এটি আপনাকে প্রচুর সাহায্য করতে পারে। আপনার ক্ষেত্রে জাভা কোডটি যদি আপনার কাছে থাকে তবে এটির মতো দেখাবেMyModelExtensions.kt

public final class MyModelExtensionsKt {
   public static final int bar(@NotNull MyModel $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      return $receiver.getName().length();
   }
}

এই @JvmNameফাইলটি ব্যবহার করে আপনি এটির মাধ্যমে উন্নতি করতে পারেন bar:

@file:JvmName("MyModels")
package io.sspinc.datahub.transformation

public fun MyModel.bar(): Int {
    return this.name.length
}

এবং এটি এই কোডের ফলাফল করবে:

public final class MyModels {
   public static final int bar(@NotNull MyModel $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      return $receiver.getName().length();
   }
}

ব্যবহার MyModelsকি কার্যকর জাভা ইউটিলিটি শ্রেণীর জন্য প্রস্তাব দেওয়া সঙ্গে সঙ্গতিপূর্ণ নয়। আপনি নিজের পদ্ধতির নামও এভাবে পরিবর্তন করতে পারেন:

public fun MyModel.extractBar(): Int {
    return this.name.length
}

তারপরে জাভা দিক থেকে এটি অদ্ভুত লাগবে:

MyModels.extractBar(model);

0

আপনার ক্লাস ফাইলগুলিতে আপনার ফাংশনগুলি নকল করা প্রয়োজন:

প্রাক্তন Utils.kt এর জন্য কোটলিন ফাইল তৈরি করুন

কোডটি লিখুন

  class Utils {
                companion object {
                    @JvmStatic
                    fun String.getLength(): Int {//duplicate of func for java
                        return this.length
                    }
                }
            }

        fun String.getLength(): Int {//kotlin extension function
            return this.length
        }

অথবা

class Utils {
    companion object {

        @JvmStatic
        fun getLength(s: String): Int {//init func for java
            return s.length
        }
    }
}

fun String.getLength(): Int {//kotlin extension function
    return Utils.Companion.getLength(this)//calling java extension function in Companion
}

কোটলিনে ব্যবহার করুন:

val str = ""
val lenth = str.getLength()

জাভাতে এটি ব্যবহার করুন:

String str = "";
 Integer lenth = Utils.getLength(str);

0

এটা আমার জন্য কাজ করে:

Kotlin kotlin

জাভা কোড এখানে চিত্র বর্ণনা লিখুন

আমার প্রকল্পটি একটি পুরানো অ্যান্ড্রয়েড প্রকল্প যা জাভা দিয়ে তৈরি; এখন আমি প্রথম কোটলিন ফাইল তৈরি করেছি এবং স্ট্রিং এক্সটেনশনগুলি মজাদার স্ট্রিং.আইসনোটনুলআরম্পিটি (): বুলিয়ান {...}

এবং আমি জাভা ফাইল থেকে এটি কল করতে পারতাম: স্ট্রিংইটিলসকিটি.আইসনোটনলআরআম্পটি (দ্য স্ট্রিং)।

আমার কোটলিন ফাইলের নাম স্ট্রিংআপিলস


-1

অন্যান্য উত্তর এখানে কোটলিন প্যাকেজ ফাইলের শীর্ষ স্তরে অবস্থিত একটি এক্সটেনশন ফাংশন কল করার ক্ষেত্রে কভার করে।

যাইহোক, আমার কেসটি ছিল যে আমাকে ক্লাসের ভিতরে অবস্থিত একটি এক্সটেনশন ফাংশন কল করতে হবে। বিশেষত, আমি একটি বিষয় নিয়ে কাজ করছিলাম dealing

সমাধান অবিশ্বাস্যভাবে সহজ

আপনাকে যা করতে হবে তা হ'ল আপনার এক্সটেনশান ফাংশনটিকে @JvmStatic, এবং ভয়েলা হিসাবে টীকা দেবে ! আপনার জাভা কোড এটি অ্যাক্সেস করতে এবং এটি ব্যবহার করতে সক্ষম হবে।


ডাউনটা কেন? আমার উত্তরটি সঠিক এবং আসল।
forresthopkinsa

-2

আপনি যখন এই শ্রেণীর প্রসারিত করবেন:

fun String.concatenatedLength(str: String): Int {
    return (this.length + str.length)
}

fun f() {
    var len = "one string".concatenatedLength("another string")
    println(len)
}

এটি এটি সংকলন করবে:

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

public final class ExampleKt {
  public static final int concatenatedLength(@NotNull String $receiver, @NotNull String str) {
    Intrinsics.checkParameterIsNotNull((Object) $receiver, (String) "$receiver");
    Intrinsics.checkParameterIsNotNull((Object) str, (String) "str");
    return $receiver.length() + str.length();
  }

  public static final void f() {
    int len = ExampleKt.concatenatedLength("one string", "another string");
    System.out.println(len);
  }
}

এখানে আরও উদাহরণ রয়েছে


-3

আমি যতদূর বলতে পারি এটি সম্ভব নয়। এক্সটেনশন ডক্সের আমার পড়া থেকে, এটি প্রদর্শিত হয়

public fun MyModel.bar(): Int {
    return this.name.length()
}

স্বাক্ষর সহ একটি নতুন পদ্ধতি তৈরি করে

public static int MyModelBar(MyModel obj) {
    return obj.name.length();
}

তারপরে, কোটলিন ম্যাপগুলি ফর্মটির কলগুলিতে কাজ করে myModel.bar(), যেখানে শ্রেণিতে bar()পাওয়া না গেলে MyModelএটি স্বাক্ষরের সাথে মিল রেখে স্থির পদ্ধতিগুলির সন্ধান করে এবং ফলাফলটি নামকরণ করে যা ফলাফল আউটপুট করে। নোট করুন যে এক্সটেনশানগুলি স্থিতিশীলভাবে আমদানি করা হচ্ছে এবং সংজ্ঞায়িত পদ্ধতিগুলিকে ওভাররাইড না করা সম্পর্কে তাদের বক্তব্য থেকে এটি কেবলমাত্র অনুমান। আমি তাদের উত্সে নিশ্চিতভাবে জানার মতো পর্যাপ্ত পরিমাণে পাই নি।

সুতরাং, উপরের অংশটিকে সত্য বলে ধরে নেওয়া সত্য যে পুরাতন জাভা কোড থেকে কোটলিন এক্সটেনশনগুলি কল করার কোনও উপায় নেই, কারণ সংকলকটি কেবল কোনও অজানা পদ্ধতিতে ডাকবে এবং ত্রুটি থেকে বেরিয়ে আসবে।


3
এই উত্তরটি সঠিক নয়, এগুলি অ্যাক্সেস করা যেতে পারে। গৃহীত উত্তর দেখুন।
জেসন মিনার্ড

এবং সংকলক স্থিতিশীল পদ্ধতিগুলি (বিশেষত জাভা স্ট্যাটিক পদ্ধতি নয়) অনুসন্ধান করছে না। এটি একই ফাইলটিতে ঘোষিত বা আমদানি করা এক্সটেনশন পদ্ধতিগুলির সন্ধান করছে।
কিরিল রাখমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.