ওভারলোড পদ্ধতিতে বাইট আর্গুমেন্টগুলি পাস করা


12

আমি কিছু কোড থেকে এই কোড স্নিপেট নিয়েছিলাম, আইডিই ব্যবহার করে আমি এটি কার্যকর করেছিলাম এবং দীর্ঘ, দীর্ঘ তবে একটি ফলাফল পেয়েছি তবে সঠিক উত্তরটি হ'ল ফলাফল পেয়েছি বাইট, বাইট , কেন আমি আলাদা ফলাফল পেয়েছি? প্রশ্ন জেডিকে 11 এর সাথে সম্পর্কিত

public class Client {
    static void doCalc(byte... a) {
        System.out.print("byte...");
    }

    static void doCalc(long a, long b) {
        System.out.print("long, long");
    }

    static void doCalc(Byte s1, Byte s2) {
        System.out.print("Byte, Byte");
    }

    public static void main(String[] args) {
        byte b = 5;
        doCalc(b, b);
    }
}

সম্পাদিত:

কোডটি এখানে নেওয়া হয়েছিল: ওরাকল শংসাপত্রের ওভারভিউ এবং নমুনা প্রশ্নসমূহ (পৃষ্ঠা: 13, প্রশ্ন: 5)


1
আপনি কি নিশ্চিত যে এটি Byte b = 5;মূলধন
বিয়ের সাথে নেই

4
আমি long, longজাভা 8 এও এফওয়াইআই তে উঠি ... কেন সৎ হতে হবে তা নিশ্চিত নয়, উত্তরের জন্য
অপেক্ষাও করছি

উত্তর:


6

সুতরাং, আপনি যদি সংকলনের সময় পদ্ধতি স্বাক্ষর নির্ধারণের জন্য জাভা ভাষার নির্দিষ্টকরণের মধ্য দিয়ে যান তবে এটি পরিষ্কার হয়ে যাবে:

  1. প্রথম পর্যায়ে (.115.12.2.2) বক্সিং বা আনবক্সিং রূপান্তর বা ভেরিয়েবল আরেটি পদ্ধতি অনুরোধের ব্যবহার ছাড়াই ওভারলোড রেজোলিউশন সম্পাদন করে। যদি এই পর্যায়ে কোনও প্রযোজ্য পদ্ধতি না পাওয়া যায় তবে দ্বিতীয় পর্যায়ে প্রক্রিয়াজাতকরণ অব্যাহত থাকে।

  2. দ্বিতীয় পর্ব (§15.12.2.3) বক্সিং এবং আনবক্সিংয়ের অনুমতি দেওয়ার সময় ওভারলোড রেজোলিউশন সম্পাদন করে, তবে এখনও ভেরিয়েবল আরটি পদ্ধতি অনুরোধের ব্যবহারকে বাদ দেয়। যদি এই পর্যায়ে কোনও প্রযোজ্য পদ্ধতি না পাওয়া যায় তবে তৃতীয় পর্যায়ে প্রক্রিয়াকরণ অব্যাহত থাকে।

  3. তৃতীয় পর্ব (§15.12.2.4) ওভারলোডিংকে ভেরিয়েবল আরটি পদ্ধতি, বক্সিং এবং আনবক্সিংয়ের সাথে একত্রিত করার অনুমতি দেয়।

সুতরাং, উপরের পদক্ষেপগুলি থেকে, এটি স্পষ্ট যে আপনার ক্ষেত্রে জাভা সংকলকটি প্রথম পর্যায়ে একটি মিলে যাওয়া পদ্ধতি আবিষ্কার করবে যা এটি করে doCalc(long a,long b)doCalc(Byte s1, Byte s2)কল করার সময় আপনার পদ্ধতির একটি অটোবক্সিং দরকার তাই এটি কম পছন্দ অর্জন করবে।


1
কেন longগ্রহণ করে তা নিয়ে byte, প্রসারিত আদিম রূপান্তর অনুসরণ করা হবে বলে মনে হচ্ছে : ডকস.অরাকল . com / javase / specs / jls / se7 / html / jls-5.html#jls-5.1.2 । তাই মূলত, +widening -boxing -varargsতারপর +widening +boxing -varargsতারপর +widening +boxing +varargs
sp00m

@kbo আপনি কেন মনে করেন যে সঠিক উত্তরটি Byte, Byte?
অমিত বেরা

3
@ কেবো আমার ধারণা সঠিক উত্তরটি ভুল: :) আপনি যদি পারেন তবে এই প্রশ্নের পক্ষে লেখকদের ইঙ্গিত করার উপযুক্ত হতে পারে।
sp00m

3
@ sp00m আমি ওরাকল এর নমুনায় এই প্রশ্নটি পেয়েছি, দয়া করে সম্পাদিত অংশটি একবার দেখুন
kbo

@ কেবো বাহ ... তাহলে কীভাবে এগিয়ে যাবেন ধারণা নেই!
sp00m

2

রূপান্তরগুলির বিষয়ে দয়া করে জেএলএস অধ্যায়টি পড়ুন ।

আপনার ক্ষেত্রে যা ঘটছে তা হ'ল রানটাইম চলাকালীন, জেভিএম বিস্তৃত রূপান্তর সম্পাদন করতে বেছে নেয় byte -> longকারণ এটি রূপান্তরটি নিরাপদ কারণ এটির নিশ্চয়তা রয়েছে যে এটি সৃষ্টি করে না RuntimeException

থেকে রূপান্তর byteকরতে Byteনামেও বক্সিং ঘটাতে পারে OutOfMemoryError যেমন জেভিএম গাদা সম্মুখের নতুন বস্তু বরাদ্দ করা আছে:

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

যে কারণে, নিরাপদ byte -> long প্রশস্তকরণ রূপান্তর পছন্দ করা হয়।


2
কেবল লক্ষণীয়, বক্সিং থেকে কখনই কারণ byteহয় Byteনা OutOfMemoryException, যেহেতু Byte(-128 - 127) এর সমস্ত মান অভ্যন্তরীণভাবে ক্যাশেড। তবে অন্যান্য ধরণের ক্ষেত্রে এটি একইরকম নাও হতে পারে, তাই থাম্বের বিধি হিসাবে, রূপান্তরকে প্রসারিত করা অগ্রাধিকার পায়।
পাভেল স্মারনভ

1

সঠিক ওভারলোড সন্ধানের জন্য, অর্ডারটি হ'ল:

  1. পরামিতি সংখ্যা দ্বারা
  2. বক্সিং / আনবক্সিং
  3. বৈকল্পিক পরামিতি

সুতরাং

  • যদি bকোথায় Byteফলাফল হয়Byte, Byte
  • পাস হলে new byte[] { b, b }ফলাফল হতbyte, byte
  • যদি দুটি বাইট বি পাস করা হয়, বাইট থেকে দীর্ঘ পর্যন্ত প্রসারিত হওয়া সম্ভব এবং ফলস্বরূপlong, long
  • দীর্ঘ, দীর্ঘ ওভারলোড সরানো হলে Byte, Byteফলাফল।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.