কোটলিন: ইন্টারফেস… এর কনস্ট্রাক্টর নেই


138

আমি আমার কিছু জাভা কোডটি কোটলিনে রূপান্তর করছি এবং কোটলিন কোডে সংজ্ঞায়িত ইন্টারফেসগুলি কীভাবে ইনস্ট্যান্ট করতে হবে তা আমি যথেষ্ট বুঝতে পারি না। উদাহরণ হিসাবে, আমার একটি ইন্টারফেস রয়েছে (জাভা কোডে সংজ্ঞায়িত):

public interface MyInterface {
    void onLocationMeasured(Location location);
}

এবং তারপরে আমার কোটলিন কোডে আমি এই ইন্টারফেসটি ইনস্ট্যান্ট করি:

val myObj = new MyInterface { Log.d("...", "...") }

এবং এটা ঠিক কাজ করে। যাইহোক, যখন আমি মাইআইন্টারফেসকে কোটলিনে রূপান্তর করি:

interface MyInterface {
    fun onLocationMeasured(location: Location)
}

আমি একটি ত্রুটি বার্তা Interface MyListener does not have constructorsপাই : যখন আমি এটি ইনস্ট্যান্ট করার চেষ্টা করি - যদিও এটি আমার কাছে মনে হয় সিনট্যাক্স ব্যতীত কিছুই পরিবর্তন হয়নি। ইন্টারফেস কীভাবে কোটলিনে কাজ করে তা আমি ভুল বুঝি?

উত্তর:


225

আপনার জাভা কোডটি এসএএম রূপান্তরের উপর নির্ভর করে - একটি একক বিমূর্ত পদ্ধতিতে একটি ল্যাম্বডাকে একটি ইন্টারফেসে রূপান্তর করে। কোটলিনে সংজ্ঞায়িত ইন্টারফেসের জন্য বর্তমানে এসএএম রূপান্তর সমর্থিত নয় । পরিবর্তে, আপনাকে ইন্টারফেস প্রয়োগকারী একটি বেনামে সংজ্ঞা দিতে হবে:

val obj = object : MyInterface {
    override fun onLocationMeasured(location: Location) { ... }
}

14
অনেক ধন্যবাদ. আপনার পোস্ট করা লিঙ্কটি থেকে, আমি বুঝতে পারি যে Location -> Unitযদি সম্ভব হয় তবে একক-পদ্ধতিগত ইন্টারফেসের পরিবর্তে ক্রিয়ামূলক ধরনের (যেমন ) ব্যবহার করা ভাল - এটি কি সঠিক?
আলেফ আলেফ

4
এটা সঠিক. আপনার যেখানেই সম্ভব ফাংশনাল টাইপ ব্যবহার করা উচিত।
ইয়াওভ স্টার্নবার্গ

তবে আমার ক্ষেত্রে ইন্টারফেসের (সারফেসটেকচার লাস্টার) একাধিক পদ্ধতি ছিল।
তাশ পেমিভা

অনেক ধন্যবাদ. এই উত্তরের আরও বেশি পছন্দ বা কিছু বিশেষ চিহ্ন থাকতে হবে, কারণ এটি খুব দরকারী তথ্য এবং দুর্ভাগ্যক্রমে কিছু শিক্ষার্থী যখন কোটলিনকে নিবন্ধগুলি দ্বারা শিখতে বা "এসএএম বিষয়গুলিতে" কোটলিন ইন অ্যাকশন "দ্বারা বিভ্রান্ত হয়ে উঠতে পারে তখন তারা এসএএম বিষয়ের দিকে নজর দেয়।
TT_W

"কোটলিন ইন অ্যাকশন" থেকে, হ্যাঁ, আপনি জাভা এর এসএএম পরমতে ল্যাম্বডাকে সংক্ষিপ্ত এবং ক্লিনার কোডের জন্য ব্যবহার করতে পারেন, তবে কোটলিনের এসএএম নয়, ফাংশন টাইপ কোটলিনে প্রথম শ্রেণি, সুতরাং, এসএএম কোটলিনের জন্য অর্থ নয়, টাইপালিয়াস সহ ফাংশন টাইপ আরও কোটলিন স্টাইল।
vg0x00

17

আপনার জাভা ইন্টারফেসের জায়গায় টাইপালিয়াস ব্যবহার করা সবচেয়ে ভাল সমাধান

typealias MyInterface = (Location) -> Unit

fun addLocationHandler(myInterface:MyInterface) {

}

এটির মতো নিবন্ধন করুন:

val myObject = { location -> ...}
addLocationHandler(myObject)

এমনকি ক্লিনার

addLocationHandler { location -> ...}

এটি এভাবে চালান:

myInterface.invoke(location)

3 টি বর্তমান বিকল্প বলে মনে হচ্ছে:

  • টাইপালিয়াস (জাভা থেকে ডাকলে অগোছালো)
  • কোটলিন ইন্টারফেস (কোটলিন থেকে কল হলে অগোছালো; আপনাকে কোনও বিষয় তৈরি করতে হবে) এটি আইএমওর একটি বড় পদক্ষেপ।
  • জাভা ইন্টারফেস (কোটলিন থেকে ডাকলে কম অগোছালো; ল্যাম্বডা ইন্টারফেসের নাম প্রিপেন্ড করা দরকার যাতে আপনার কোনও জিনিসের প্রয়োজন হয় না; এছাড়াও ফাংশন বন্ধনী কনভেনশনের বাইরে ল্যাম্বডা ব্যবহার করতে পারবেন না)

আমাদের লাইব্রেরিগুলি কোটলিনে রূপান্তরিত করার সময়, আমরা আসলে সমস্ত জাভা কোডে ইন্টারফেস রেখেছিলাম, কারণ কোটলিন থেকে কোটলিনের চেয়ে কোটলিন থেকে জাভা কল করা ক্লিনার ছিল।


8

আপনার ইন্টারফেসে এভাবে প্রবেশ করার চেষ্টা করুন:

 object : MyInterface {
    override fun onSomething() { ... }
}

6

আপনার যদি জাভা ক্লাস থাকে তবে :

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener()
        {
              //Your Code
        }));

আপনি এই কোডটি জাভা থেকে কোটলিনে এইভাবে রূপান্তর করুন :

override fun showJozList (list : List<ResponseGetJuzList.Parameter4>) {
        adapter.addData(list)
        jozlist_recycler.addOnItemTouchListener(RecyclerTouchListener(
                activity ,
                jozlist_recycler ,
                object : RecyclerTouchListener.ClickListener
                    {
                          //Your Code
                    }))

জাভা ইন্টারফেস রূপান্তর :

new RecyclerTouchListener.ClickListener()

থেকে Kotlin ইন্টারফেস শৈলী:

object : RecyclerTouchListener.ClickListener

1

যদি ইন্টারফেসটি কোনও শ্রেনীর শ্রোতার পদ্ধতির জন্য হয় তবে ইন্টারফেস সংজ্ঞাটি ফাংশনের ধরণে পরিবর্তন করুন। এটি কোডটিকে আরও সংক্ষিপ্ত করে তোলে। নিম্নলিখিত দেখুন।

শ্রোতার সংজ্ঞা সমন্বিত শ্রেণি

// A class
private var mLocationMeasuredListener = (location: Location) -> Unit = {}

var setOnLocationMeasuredListener(listener: (location: Location) -> Unit) {
    mLocationMeasuredListener = listener
}

// somewhere in A class
mLocationMeasuredListener(location)

আর এক ক্লাস

// B class
aClass.setOnLocationMeasuredListener { location ->
    // your code
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.