কেন জাভা অটোবক্সিং অটোবক্সেড প্রকারের পদ্ধতির আমন্ত্রণের জন্য প্রসারিত হয় না?

আমি একটি আদিম একটি স্ট্রিং রূপান্তর করতে চান, এবং আমি চেষ্টা:

myInt.toString();

এই ত্রুটির সঙ্গে ব্যর্থ:

int cannot be dereferenced

এখন, আমি যে primitives রেফারেন্স ধরনের হয় না (অর্থাৎ, একটি বস্তু নয়) এবং তাই পদ্ধতিগুলি থাকতে পারে না। যাইহোক, জাভা 5টি অটোবক্সিং এবং অক্সবক্সিং (একটি লা সি # ... যা আমি সি # তে পছন্দ করি নি, কিন্তু এটির পাশেও ছিল)। তাই অটোবক্সিং এর সাথে, আমি উপরেরটি myInt কে একটি পূর্ণসংখ্যা রূপান্তর করতে এবং তারপর স্ট্রিং() এ কল করতে আশা করি।

উপরন্তু, আমি বিশ্বাস করি C# এই ধরনের একটি কল অনুমতি দেয়, যদি না আমি ভুল মনে করি। এটি কি জাভা এর অটোবক্সিং / অবাঞ্ছিত স্পেসিফিকেশনের একটি দুর্ভাগ্যজনক দুর্ঘটনা, অথবা এর জন্য একটি ভাল কারণ আছে?

0
ro fr hi

8 উত্তর

জাভা অটোবক্সিং / অবাঞ্ছিতকরণ একটি আদিম অপ্রয়োজনীয়তার জন্য আপনাকে অনুমতি দেয় না, তাই আপনার কম্পাইলার এটি আটকায়। আপনার কম্পাইলার এখনও একটি প্রাথমিক হিসাবে myInt জানেন এই সমস্যাটি সম্পর্কে jcp.org এ একটি কাগজ আছে।

অটোবক্সিং মূলত কার্যনির্বাহী বা প্যারামিটার পাসিংয়ের সময় কার্যকরী - আপনি একটি আদিম হিসাবে একটি বস্তুর (বা বিপরীতভাবে) পাস করতে বা একটি বস্তুর (বা তদ্বিপরীত) একটি আদিম বরাদ্দ করার অনুমতি দেয়।

তাই দুর্ভাগ্যবশত, আপনি এই মত এটি করতে হবে: (কুদস প্যাট্রিক, আমি আপনার উপায় সুইচ)

Integer.toString(myInt);
0
যোগ

ঠিক আছে জাস্টিন কি বলেন, কিন্তু আপনি পরিবর্তে এটি করতে হবে:

Integer.toString(myInt);

এটি একটি বরাদ্দ বা দুই সংরক্ষণ এবং আরো পাঠযোগ্য।

0
যোগ

এটি সহায়ক হতে পারে যদি জেবা আদিম ধরনের কাজ করার জন্য নির্দিষ্ট স্ট্যাটিক পদ্ধতি সংজ্ঞায়িত করে এবং কিছু সিনট্যাক্টিক চিনি কম্পাইলারের মধ্যে নির্মিত হয়

5.asInteger

সমতুল্য হতে হবে

some.magic.stuff.Integer.asInteger(5);

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

0
যোগ

আপনার উদাহরণে সবচেয়ে নিকটতম সিনট্যাক্সটি হল

((Integer) myInt).toString();

যখন কম্পাইলার শেষ হয়, এটির সমতুল্য

Integer.valueOf(myInt).toString();

যাইহোক, এটি প্রচলিত ব্যবহারের পাশাপাশি, String.valueOf (myInt) সঞ্চালন করে না, কারণ বিশেষ ক্ষেত্রে বাদে এটি একটি নতুন ইন্টিজার দৃষ্টান্ত তৈরি করে, তারপর অবিলম্বে তা ছিটকে দেয়, ফলে আরো অপ্রয়োজনীয় আবর্জনা। (পূর্ণসংখ্যা একটি ছোট পরিসীমা ক্যাশে করা হয়, এবং একটি অ্যারে এক্সেস দ্বারা অ্যাক্সেস।) সম্ভবত ভাষা ডিজাইনার কর্মক্ষমতা কারণে এই ব্যবহার হতাশ করতে চেয়েছিলেন।

সম্পাদনা করুন: ডাউনউইটার (গুলি) মন্তব্য করবে কেন এটি সহায়ক নয় সম্পর্কে মন্তব্য করবে।

0
যোগ
আমি সব নিচে ভোটার ভোট কেন্দ্রে কিছু নিচে পায় কেন মন্তব্য করবে। আমি সর্বদা এটি যদি না সুস্পষ্ট (যেমন উত্তর সম্পূর্ণ ভুল বা অর্থহীন)।
যোগ লেখক Jason Coco, উৎস
সম্ভবত লোকজন যে কেবল কোড বিট পড়তে নিচে ভোট এবং চিন্তা আপনার যেমন কোড সমর্থনকারী ছিল।
যোগ লেখক Kris, উৎস

একটি অপ্রতুল মত মনে হচ্ছে   আমাকে স্পেসিফিকেশন

আরো ত্রুটি আছে এবং এটি একটি সূক্ষ্ম বিষয়। চেক করুন এই আউট:

public class methodOverloading{
   public static void hello(Integer x){
      System.out.println("Integer");
   }

   public static void hello(long x){
      System.out.println("long");
   }

   public static void main(String[] args){
      int i = 5;
      hello(i);
   }
}

এখানে "লম্বা" মুদ্রিত হবে (এটি নিজেকে পরীক্ষা না করে), কারণ কম্পাইলার স্বতঃস্ফূর্তভাবে চওড়া চওড়া করে। Autoboxing ব্যবহার করার সময় সাবধান থাকুন বা এটিকে সর্বদা ব্যবহার করবেন না!

0
যোগ

প্রত্যেকেরই ইঙ্গিত করা হয়েছে যে, অটোবক্সিং আপনাকে কিছু কোড সহজ করে দেয়, তবে আপনি যে প্রিমিটিভগুলি জটিল প্রকারগুলি ভাসাবেন না।

এছাড়াও আকর্ষণীয়: "অটবক্সিং একটি কম্পাইলার-স্তর হ্যাক" জাভাতে Autoboxing মূলত জাভা জুড়ে যোগ করা একটি অদ্ভুত ক্লেজ। এই অদ্ভুত ব্যাপারটি সম্পর্কে আরও বিস্তারিত জানার জন্য এই পোস্ট চেক করুন ।

0
যোগ

সি # এ, ইন্টিজাররা কোনও রেফারেন্সের ধরন নয় এবং তাদের নামকরণ করার জন্য ToString() বক্সে থাকা উচিত নয়। তারা কাঠামোর মধ্যে বিবেচিত বস্তুগুলি (একটি ValueType হিসাবে, তাই তাদের মান শব্দের অর্থ আছে) তবে, সিএলআর-র মধ্যে, প্রিমিটিভের পদ্ধতিগুলিকে "পরোক্ষভাবে" স্ট্যাকের উপর (ldind) লোড করে লোড করা হয়।

0
যোগ

এটি করতে অন্য একটি উপায় ব্যবহার করা হয়:

String.valueOf(myInt);

এই পদ্ধতিটি প্রতিটি আদিম ধরন এবং অবজেক্ট এর জন্য ওভারলোড করা হয়েছে। এই ভাবে আপনি ব্যবহার করছেন যে ধরনের সম্পর্কে এমনকি চিন্তা করতে হবে না। পদ্ধতিটির বাস্তবায়ন আপনার জন্য প্রদত্ত টাইপের যথাযথ পদ্ধতিতে কল করবে, যেমন <�কোড> Integer.toString (মিন্ত) </কোড>।

http://java.sun.com/javase/ দেখুন 6 / ডক্স / API / জাভা / ল্যাঙ / String.html

0
যোগ