জাভা বিভিন্ন রিটার্ন টাইপ সঙ্গে ওভারলোড?


104

কেবল রিটার্নের ধরণ পরিবর্তন করে কোনও ফাংশন ওভারলোড করা কেন সম্ভব নয়? জাভা এর ভবিষ্যতের সংস্করণে কি তা পরিবর্তন হবে?

যাইহোক, কেবল রেফারেন্সের জন্য, এটি কি সি ++ এ সম্ভব?



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

উত্তর:


157

আপনি এটি জাভাতে করতে পারবেন না এবং আপনি এটি সি ++ এও করতে পারবেন না। যৌক্তিকতাটি হ'ল যে ফাংশনটি কল করতে হবে তা নির্ধারণের জন্য কম্পাইলারের জন্য একা রিটার্ন মান যথেষ্ট নয়:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?

3
আমি সর্বদা ভেবেছিলাম যে আমরা যদি int i = foo () বা float f = foo () এর মতো কিছু করি তবে এটি কোনটি জানতে পারে, তবে যদি বিবৃতিটি কেবল ফাংশন হয় তবে এটি সংকলকটি জানতে পারে না। আমি এটা জানতে পারি। ধন্যবাদ।
নুনোস

7
@ নুনোস এমনকি এটি ফ্লোট এফ = foo () থাকলেও সংকলক এটি নির্ধারণ করতে সক্ষম হবেনা কারণ উভয় ইন্টি ফ্লোটের জন্য বৈধ ইনপুট হবে। ফ্লোট এফ = 7 এর সাথে তুলনা করুন; (7 টি কি ভাসা বা ইনট?)
NomeN

5
@ নোমেন তবে আপনার বক্তব্যটি সুপারিশ করে যে সংকলকটির জন্য ফানক (ইনট আই) এবং ফানক (ফ্লোট আই) পৃথক হতে পারে - এবং আমরা সবাই জানি এটি সত্য নয়। আসল কারণটি ওবেদ দ্বারা দেওয়া হয়েছে (পরবর্তী উত্তর দেখুন) - এটি পদ্ধতির স্বাক্ষর সম্পর্কে। এবং, বিটিডব্লিউ। 7 অবশ্যই পূর্ণসংখ্যা হয় যখন 7.0 বা 7f ভাসমান ;-)
তা সাস

7
7.0 হয় না float, এটি double
ফ্রেডওভারফ্লো

3
foo();কোনও রিটার্নের ধরণ ছাড়াই অস্পষ্ট হবে তা সত্য নয় যে এটি একটি ওভারলোড হিসাবে অস্বীকার করার কোনও কারণ নয়। এমন যুক্তি রয়েছে যা দ্ব্যর্থহীনতা তৈরি করতে পারে (উদাঃ foo(null);), তবে এটি ওভারলোডকে সহজাতভাবে অবৈধ করে না।
shmosel

48

কারণটি হ'ল জাভাতে ওভারলোডগুলি কেবলমাত্র বিভিন্ন স্বাক্ষরযুক্ত পদ্ধতির জন্য অনুমোদিত ।

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

জাভা টিউটোরিয়ালগুলি থেকে সংজ্ঞায়িত পদ্ধতিগুলি দেখুন ।


4
তবে কেন রিটার্ন টাইপ স্বাক্ষরের

51
ওহ "শুধু কারণ"! আমি দেখি.
andho

3
রিটার্ন টাইপ হল পদ্ধতি স্বাক্ষরের একটি অংশ। ক্লাস ডিসঅ্যাসাব্লুয়েশনে শুধু তাকান।
কন্মিক

2
এটি সত্যিই @ কনমিক নয় - পদ্ধতি ওভারলোডিংয়ের নিয়ম অনুসারে নয়। চেষ্টা করে দেখুন একই পদ্ধতির নাম, একই ক্রমের একই পরামিতি প্রকারগুলি, বিভিন্ন ফেরতের প্রকার। সংকলন করবে না
ওডে

3
হ্যাঁ, কারণ রিটার্নের ধরণটি স্বাক্ষরের অংশ নয় । স্বাক্ষরটি হ'ল পদ্ধতির নাম + এর প্যারামিটারের প্রকার এবং ক্রম। আমার উত্তরে প্রদত্ত লিঙ্কটি পড়ুন: "উপরে ঘোষিত পদ্ধতির স্বাক্ষরটি হ'ল: calculateAnswer(double, int, double, double)"। দেখুন যে ফিরতি প্রকারটি অন্তর্ভুক্ত নেই, @ কনমিক।
ওদে

22

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


3
আমি যখন প্রথম দেখলাম তখন আমি হতবাক হয়ে গেলাম। কেন এটি সম্ভব তা ব্যাখ্যা করার জন্য ধন্যবাদ!
ডিলান নোলস

2
ওভারলোডিং এবং ওভাররাইডিং আলাদা।
ওভারলোডিং

3
এই উত্তরটি জাভাতে কোনও নবজাতকের পক্ষে বিভ্রান্তিমূলক শোনা যায়, কারণ এটি ওভারলোডিংয়ের সাথে মোটেই প্রাসঙ্গিক নয়, এটি ওভাররাইডিং - সম্পূর্ণ অন্য জিনিস।
আজিজবিকিয়ান

4

Overloaded যুক্তিটিও পৃথক বলে প্রদত্ত জাভা পদ্ধতিতে ভিন্ন ভিন্ন রিটার্নের ধরণ থাকতে পারে।

নমুনা কোডটি দেখুন।

public class B {

    public String greet() {
        return "Hello";
    }

    //This will work
    public StringBuilder greet(String name) {
        return new StringBuilder("Hello " + name);
    }

    //This will not work
    //Error: Duplicate method greet() in type B
    public StringBuilder greet() {
        return new StringBuilder("Hello Tarzan");
    }

}

মূলত রিটার্নের ধরণটি বিবেচনায় নেওয়া হয় না, কেবল যুক্তিগুলি, দুঃখজনক হলেও সত্য
আলেকজান্ডার মিলস

1

সংযোজনকারী পদ্ধতিগুলি পৃথক করার সময় রিটার্নের ধরণটিকে বিবেচনা করে না, সুতরাং তাদের পৃথক রিটার্নের ধরণ থাকলেও আপনি একই স্বাক্ষর সহ দুটি পদ্ধতি ঘোষণা করতে পারবেন না।


1

কোনও পদ্ধতি ওভারলোড করার সময় রিটার্নের ধরণের বিষয়টি বিবেচনা করে না। আমাদের কেবল কোনও অস্পষ্টতা নিশ্চিত করতে হবে!

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


0

সংযোজনকারী পদ্ধতিগুলি পৃথক করার সময় রিটার্নের ধরণটিকে বিবেচনা করে না, সুতরাং তাদের পৃথক রিটার্নের ধরণ থাকলেও আপনি একই স্বাক্ষর সহ দুটি পদ্ধতি ঘোষণা করতে পারবেন না।

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

কম টাইপ ত্রুটি রান টাইম ত্রুটির চেয়ে ভাল। সুতরাং, আপনি একই পরামিতিগুলি একই পদ্ধতি ঘোষণা করলে জাভা সংকলক সংকলক সময় ত্রুটি রেন্ডার করে।


এটি কীভাবে গৃহীত উত্তর থেকে আলাদা? (এছাড়াও এটি একটি সংকলন সময় ত্রুটি হওয়ার কারণ
হ'ল সংকলকটি

-2

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

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