জাভা 8 এ অনুমান টাইপ করুন


30

জাভা 8-তে নতুন ল্যাম্বডে সংকেত (যেমন এই নিবন্ধটি দেখুন ) প্রবর্তনের জন্য কোনও প্রকারের অনুক্রমের প্রয়োজন হবে?

যদি তা হয় তবে নতুন টাইপ সিস্টেমটি কীভাবে পুরো জাভা ভাষায় প্রভাব ফেলবে?

উত্তর:


47

র‌্যাচেট ফ্রিকের জবাব এবং এর মন্তব্যের সুত্রটিতে মোটামুটি ভুল তথ্য রয়েছে । আমি এখানে একটি উত্তরে প্রতিক্রিয়া জানাবো, যেহেতু একটি মন্তব্য খুব ছোট। এছাড়াও, যেহেতু এটি সর্বোপরি একটি উত্তর, আমি মূল প্রশ্নেরও উত্তর দেওয়ার চেষ্টা করব। (তবে লক্ষ করুন যে আমি টাইপ সিস্টেমে বিশেষজ্ঞ নই।)

প্রথমত, মূল প্রশ্নের সংক্ষিপ্ত উত্তর হ্যাঁ এবং হ্যাঁ, হ্যাঁ, জাভা 8-তে জাভা than-এর চেয়ে উল্লেখযোগ্যভাবে আরও বেশি টাইপ হবে এবং জাভা 8-তে "নতুন" টাইপ সিস্টেম নেই, যদিও কিছু ছোটখাটো পরিবর্তন রয়েছে ।

জাভা 8 এখনও স্থিরভাবে টাইপ করা হবে এবং এটি এখনও ক্লাস এবং ইন্টারফেসের মধ্যে দ্বৈতত্ত্ব থাকবে। কোনও নতুন ধরণের যেমন ফাংশন ধরণের নেই। ল্যাম্বডার ধরণটি মূলত একটি "ফাংশনাল ইন্টারফেস" যা একক বিমূর্ত পদ্ধতি সহ একটি সাধারণ ইন্টারফেস।

ইন্টারফেসের এখন ডিফল্ট পদ্ধতিগুলির আকারে কোড থাকতে পারে তবে শ্রেণির একক-উত্তরাধিকার এবং ইন্টারফেসের একাধিক উত্তরাধিকারের মডেল একই রয়েছে। অবশ্যই কিছু সমন্বয় রয়েছে যেমন ডিফল্ট পদ্ধতির উপস্থিতিতে পদ্ধতি সমাধানের নিয়ম, তবে মৌলিকাগুলি অপরিবর্তিত থাকে।

টাইপ অনুমান দ্বারা অনুমান করা যে কোনও প্রকারের স্পষ্টভাবে লেখা যেতে পারে। র‌্যাচেট ফ্রিকের উদাহরণ ব্যবহার করতে ,

Collections.<MyClass>sort(list, (a, b) -> { return a.order - b.order; });

মূলত চিনি জন্য

Collections.<MyClass>sort(list,
    (Comparator<MyClass>)((MyClass a, MyClass b) -> { return a.order - b.order; }));

সুতরাং স্পার্কলশির বক্তব্য "টাইপ অনুক্রমের জন্য টাইপ সিস্টেমের কোনও প্রসারণ প্রয়োজন হয় না" মূলত সঠিক।

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

ল্যাম্বডা এক্সপ্রেশনগুলি আন্তঃ শ্রেণীর থেকে শব্দার্থগতভাবে পৃথক, এবং সেগুলি অভ্যন্তর শ্রেণীর চেয়ে পৃথকভাবে প্রয়োগ করা হয়।

ল্যাম্বদা এক্সপ্রেশন দুটি উপায়ে আন্তঃ শ্রেণীর থেকে শব্দার্থগতভাবে পৃথক। ল্যাম্বডা এক্সপ্রেশন মূল্যায়নের জন্য প্রতিবার একটি নতুন উদাহরণ তৈরি করার দরকার নেই। তাদের পৃথক ক্যাপচার শব্দার্থবিজ্ঞানও রয়েছে, উদাহরণস্বরূপ, তারা এটিকে অন্যভাবে ক্যাপচার করে । ইনার বর্গ ইন, এই ভেতরের বর্গ উদাহরণস্বরূপ, একটি ল্যামডা মধ্যে যেহেতু, এই এনক্লোজিং উদাহরণ। নিম্নোক্ত বিবেচনা কর:

public class CaptureThis {
    void a(Runnable r) { r.run(); }

    void b() {
        a(new Runnable() { public void run() { System.out.println(this); }});
        a(() -> System.out.println(this));
    }

    public String toString() { return "outer"; }

    public static void main(String[] args) { new CaptureThis().b(); }
}

সাম্প্রতিক জেডিকে 8 ল্যাম্বদা বিল্ডে (আমি বি 69 ব্যবহার করেছি ), আউটপুটটি নীচের মতো হবে:

CaptureThis$1@113de03
outer

তদতিরিক্ত, ল্যাম্বডা এক্সপ্রেশনগুলি অভ্যন্তর শ্রেণীর থেকে সম্পূর্ণ আলাদাভাবে প্রয়োগ করা হয়। যদি আপনি বিচ্ছিন্ন আউটপুটটির তুলনা করেন, আপনি দেখতে পাবেন যে অভ্যন্তরীণ শ্রেণি কোডটি সরাসরি তৈরি করার জন্য সংকলন করে এবং ক্যাপচারটি 1 of 1 এর নির্মাতাকে কল করে, যেখানে ল্যাম্বডা এক্সপ্রেশনটি একটি চালিতযোগ্য নির্দেশের সাথে সংমিশ্রণ করে যা রান্নেবলকে অনির্ধারিত মাধ্যমে আবিষ্কার করে। এটি কীভাবে এবং কেন কাজ করে তার পুরো ব্যাখ্যার জন্য, ব্রায়ান গোয়েটসের জাভাওন 2012 টক ল্যাম্বদা: দ্য হুডের নীচে দেখুন


2
"।। তারা এই ভিন্নভাবে ক্যাপচার ইনার বর্গ ইন, এই, ভিতরের বর্গ উদাহরণস্বরূপ একটি ল্যামডা মধ্যে যেহেতু, এই এনক্লোজিং উদাহরণস্বরূপ নিম্নলিখিত বিবেচনা করুন:" এখনও পর্যন্ত সব প্রতিস্থাপন অন্বিত চিনি দিয়ে করা যাবে thisসঙ্গেMyClass.this
র্যাচিট খামখেয়াল

4
এসেম্বলারের ছাড়িয়ে যাওয়া (এবং কখনও কখনও এমন কি) সমস্ত কিছু যুক্তিযুক্ত সিনট্যাকটিক চিনি sugar তবে ল্যাম্বডাস অভ্যন্তরীণ ক্লাসগুলির জন্য সিনট্যাকটিক চিনি নয় (আর কোনও নয়)। তারা একটি অনুরূপ লক্ষ্য পরিবেশন করে এবং কিছু সাদৃশ্য রয়েছে তবে হুডের নীচে তারা (পর্যবেক্ষণযোগ্য) আলাদা।
জোছিম সৌর

1
"ল্যাম্বদা এক্সপ্রেশনগুলি আন্তঃ শ্রেণীর থেকে শব্দার্থগতভাবে পৃথক, এবং সেগুলি অভ্যন্তর শ্রেণীর চেয়ে পৃথকভাবে প্রয়োগ করা হয়" ": খুব ভাল ব্যাখ্যার জন্য ধন্যবাদ (+1)। আমার কাছে যা এখনও স্পষ্ট নয় তা হল লাম্বদাসকে কেন বিশেষ বেনাম শ্রেণীর জন্য সিনট্যাকটিক চিনিরূপে প্রয়োগ করা হয়নি বা অন্য কথায় নতুন শব্দার্থ দ্বারা প্রবর্তিত অতিরিক্ত জটিলতার সুবিধা কী? বেনামি অভ্যন্তর শ্রেণীর সাথে সমাধান করা যায় না এমন কোন সমস্যার এটি সমাধান করে? (তবে আপনার পোস্ট করা লিঙ্কটি এখনও আমার দেখতে হবে, সম্ভবত আমি সেখানে উত্তরটি পেয়ে যাব))
জর্জিও

1
@ জোয়াচিম সৌর: আমি সিনট্যাকটিক চিনিকে একটি বিদ্যমান শব্দার্থবিজ্ঞানের জন্য একটি নতুন সিনট্যাক্স হিসাবে বিবেচনা করব। যখন নতুন শব্দার্থবিজ্ঞানের সূচনা করা হয়, তখন আমার ধারণা আপনি সিনট্যাকটিক চিনির বিষয়ে কথা বলতে পারবেন না। এই অর্থে, আমি মনে করি না যে আপনি যুক্তি দিতে পারেন যে এসেম্বলারের বাইরে সমস্ত কিছুই সিনট্যাকটিক চিনি।
জর্জিও

3
@ জর্জিও: কেন বেনামে অভ্যন্তর শ্রেণীর জন্য ল্যাম্বদা কেবল সিনট্যাকটিক চিনি নয়, তা নিয়ে এ নিয়ে একটি বিশাল আলোচনা হয়েছিল। ব্রায়ান গোয়েটসের এই মেইল ​​সিদ্ধান্তটির সংক্ষিপ্তসার জানিয়েছে: mail.openjdk.java.net/pipermail/lambda-dev/2011-August/… । টিএল; ডিআর এটি ভবিষ্যতের বিবর্তনের জন্য উন্মুক্ত দরজা ছেড়ে দেয় এবং আমরা আজ আরও ভাল পারফরম্যান্স পাই। গোয়েটস আসলে সম্পর্কিত কোনও প্রশ্নের উত্তর দিচ্ছে, ল্যাম্বডাসের জিনিস কী? তবে উত্তরটি হ্যাঁ বা না হলেও এটি বোঝায় যে তারা অভ্যন্তরীণ শ্রেণীর জন্য চিনি হতে পারে না।
স্টুয়ার্ট 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.