জাভাতে কোনও পদ্ধতির স্বাক্ষর কি তার ফেরতের ধরণের অন্তর্ভুক্ত করে?


102

কোনও জাভা ক্লাস / ইন্টারফেসে পদ্ধতি স্বাক্ষরটির কি তার ফেরতের প্রকার অন্তর্ভুক্ত থাকে?

উদাহরণ:

জাভা কি এই দুটি পদ্ধতির মধ্যে পার্থক্য জানে:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

অথবা এটি কেবলমাত্র পদ্ধতির নাম এবং পরামিতিগুলির তালিকা যে বিষয়টি?


7
যাইহোক, জাভা 6-তে জেনারিকগুলি পরিচালনা করার ক্ষেত্রে একটি ত্রুটি ছিল যা আপনাকে উভয় পদ্ধতি থাকতে দেয়, কারণ জেভিএম স্বাক্ষরে রিটার্ন টাইপ ব্যবহার করে এবং সেগুলি নির্বাচিতভাবে কল করে। এটি জাভা in. এ স্থির করা হয়েছিল ভ্যানিলাজভা.ব্লগস্পট.কম.১০
পিটার

উত্তর:


146

ওরাকল ডক্স থেকে উদ্ধৃতি :

সংজ্ঞা: একটি পদ্ধতি ঘোষণার উপাদানগুলির মধ্যে দুটি পদ্ধতির স্বাক্ষর - পদ্ধতির নাম এবং প্যারামিটারের প্রকারগুলি সমন্বিত।

এখানে চিত্র বর্ণনা লিখুন

যেহেতু এই উদাহরণটি অন্তর্ভুক্ত করার জন্য প্রশ্নটি সম্পাদিত হয়েছিল:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

না, সংকলক তাদের স্বাক্ষর হিসাবে পার্থক্যটি জানতে পারবে না: myMethod(int param) একই। দ্বিতীয় লাইন:

    public char myMethod(int param) {}

আপনাকে ত্রুটি দিতে পারে: পদ্ধতিটি ইতিমধ্যে শ্রেণিতে সংজ্ঞায়িত হয়েছে , যা উপরের বিবৃতিটির আরও নিশ্চিত করে।


সুতরাং আপনি বোঝাতে চেয়েছেন আমাদের ক্লাসে দুটি পদ্ধতি থাকতে পারে না একই পদ্ধতির নাম, একই সাথে বিভিন্ন রিটার্নের ধরণের পরামিতি?
কাসুন সিয়ামবলাপিতিয়া

6
@ কাসুনসিয়াম্বলপিতিয়া ক্রোস এর আমরা পারি না। সংকলক কীভাবে জানবে যে এরূপ দৃশ্যে কল করার পদ্ধতিগুলির মধ্যে কোনটি foo.bar(baz);?
কোলুনিয়া

@ জোপস, আমাদের কী কীওয়ার্ড রয়েছে? এটিও স্বাক্ষরের সাথে সম্পর্কিত?
আকিলা আমারসিংহে

19

জাভাতে শ্রেণি পদ্ধতি স্বাক্ষরটিতে কি রিটার্নের ধরণ অন্তর্ভুক্ত থাকে?

জাভাতে, এটি কেবল এই জেভিএম-এ নয় যা প্রকট বিভ্রান্তির দিকে নিয়ে যেতে পারে।

জাভাতে ইন্টারফেস পদ্ধতির স্বাক্ষরে কি রিটার্নের ধরণ অন্তর্ভুক্ত থাকে?

বর্গ পদ্ধতি হিসাবে একই।

অথবা শুধুমাত্র পদ্ধতির নাম এবং পরামিতিগুলির তালিকা?

জাভা জন্য পদ্ধতির নাম এবং পরামিতি প্রকার। উদাহরণস্বরূপ, প্যারামিটার টীকা এবং নামগুলি কোনও বিষয় নয়।


1
আপনি "জাভাতে এটি বোঝায় না তবে জেভিএমে এটি করে" by আপনি কীভাবে জেভিএম-তে ব্যাখ্যা করতে পারেন?
তরুণ মাগন্তী

3
@ তরুনমগন্তী জেভিএম পদ্ধতি স্বাক্ষরে ফেরতের ধরণ অন্তর্ভুক্ত করে। জাভা ভাষা হিসাবে না।
পিটার লরি

3
@xyz এটি এমন কিছু যা আপনি বাইট কোড পড়ে জাভা কোডটি না দেখে পড়ে দেখতে পারেন। যে কোনও বাইট কোড এটি দেখায়।
পিটার লরি

8

বাইটকোড স্তরে, "রিটার্ন টাইপ" পদ্ধতি স্বাক্ষরের একটি অংশ। এই বিবেচনা

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}

বাইটকোডে 2 টি ক্লোন () পদ্ধতি রয়েছে

public clone()LTest1; throws java/lang/CloneNotSupportedException 

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

তারা কেবল রিটার্নের ধরণের দ্বারা পৃথক হয়।


1
উদাহরণস্বরূপ পদ্ধতিটি প্রথম পরামিতি হিসাবে উদাহরণটি অন্তর্ভুক্ত হিসাবে এটি বিভ্রান্তিকর। একবার ভাবতে পারে যে ওম (ক) আসলে এম (ও, এ)। যেমন ক্লোনর ক্ষেত্রে, কী পার্থক্য করে তা হল আর্গুমেন্ট রিটার্ন টাইপ নয়।
হুয়ে লে



6

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


4

ব্রা, জাভাতে, আমরা তাদের নাম এবং তাদের পরামিতি দ্বারা পদ্ধতিগুলিকে কেবল আমাদের কোডে ব্যবহার করার জন্য কল করি

মাইমাথোদ (20, 40)

সুতরাং, জাভা কেবল তাদের অনুরূপ ঘোষণাপত্রে (নাম + প্যারাম) মেলে একই জাতীয় জিনিসগুলির সন্ধান করে, এ কারণেই পদ্ধতির স্বাক্ষরে কেবল পদ্ধতির নাম এবং প্যারামিটার অন্তর্ভুক্ত থাকে। :)



3

না, জাভাতে পদ্ধতি স্বাক্ষরটিতে রিটার্নের ধরণটি অন্তর্ভুক্ত নয়, তবে ঘোষণাটি রয়েছে।

public             String         getString(String myString)

^access modifier   ^return type   ^name    ^parameter type and name

নীচে প্রতিক্রিয়ার ভিত্তিতে সম্পাদিত :)


1
জেএলএস যা বলে তা নয়। এটি "একই নাম এবং যুক্তির ধরণ"। অ্যাক্সেস মডিফায়ার এবং পরামিতি নামটিও পদ্ধতি স্বাক্ষরের অংশ নয়।
পিটার লরি

যদি এটি কোনও পরীক্ষার প্রশ্ন হয় তবে তা ঠিক আছে তবে আমি যদি কোনও প্রোগ্রাম লিখছি তবে আমি পাবলিক গেটস্ট্রিং () লিখছি না, আমি পাবলিক স্ট্রিং গেটস্ট্রিং () লিখছি
জেফ হাথর্ন

1
এক্সেস পরিবর্তক, রিটার্ন টাইপ এবং ছোঁড়ার প্রকার (গুলি) স্বাক্ষর, যা তুমি কেন থাকতে পারে না অংশ নয় String method( String s )এবং Double method( String s )একই শ্রেণীতে, উদাহরণস্বরূপ।
রে স্টোজোনিক

2
সম্ভবত আপনি এর সাথে বিভ্রান্ত method signatureকরছেনmethod declaration
পিটার লরে

@ রে আমি লক্ষ করতে চাই, তিনি আমার প্রাথমিক উত্তরটি সম্পাদনা করার আগে আমার উত্তর লিখেছিলেন, তিনি যেই জিজ্ঞাসা করেছিলেন তা হ'ল স্বাক্ষরের অংশ, আমি নিশ্চিত করতে চেয়েছিলাম যে তিনি জনগণের নাম লেখার চেষ্টা করছেন না () লিখিত তালিকা না করেই লিখেছেন রিটার্নের ধরণ (সত্য বলা যেতে পারে, তিনি এটি পরীক্ষা করার জন্য একটি সাধারণ প্রোগ্রাম লিখে কেবল নিজের প্রশ্নের উত্তর দিতে পারতেন)
জেফ হাথর্ন


1

AspectJ (org.aspectj.lang.reflect.MethodSignature) ব্যবহার করে এর রিটার্ন টাইপ থাকে


1

পদ্ধতি স্বাক্ষর প্রত্যাবর্তন টাইপ অন্তর্ভুক্ত।

ডুপ্লিকেট পরীক্ষা করতে হবে যখন সংকলক এটিকে উপেক্ষা করে। জাভা জন্য দু'টি পদ্ধতি অবৈধ যা কেবলমাত্র ফেরতের প্রকারের দ্বারা স্বাক্ষর দ্বারা পৃথক হয়।

চেষ্টা কর:

public class Called {
    public String aMethod() {
        return "";
    }
}

public class Caller {
    public static void main(String[] main) {
        aMethod();
    }
    public static void aMethod() {
        Called x = new Called();
        x.aMethod();
    }
}

প্রকল্পটি তৈরি করুন, বিন ডিরেক্টরিতে যান, কলার.কাসটি কোথাও অনুলিপি করুন । তারপরে তথাকথিত পদ্ধতিটি পরিবর্তন করুন:

public int aMethod() {
    return 0;
}

প্রকল্পটি তৈরি করুন, আপনি দেখতে পাবেন যে Called.class এবং Caller.class উভয়েরই একটি নতুন টাইমস্ট্যাম্প রয়েছে। উপরে কলার.ক্লাস প্রতিস্থাপন করুন এবং প্রকল্পটি চালান। আপনার একটি ব্যতিক্রম থাকবে:

java.lang.NoSuchMethodError: it.prova.Called.aMethod()Ljava/lang/String;

0

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


0

আপনি যদি গ্রহনের উপরে উল্লিখিত কোডটি চালানোর চেষ্টা করেন তবে জাভা সংকলক জাভা পদ্ধতির মধ্যে পার্থক্য দেখানোর জন্য জাভা সংকলকটি কী দেখায় সে সম্পর্কে আপনার একটি উত্তর থাকবে:

class Foo {
    public int  myMethod(int param) {
        return param;}
    public char *myMethod*(int param) { //this line throws an error 
        return param;
    }
}

নিক্ষেপ করা ত্রুটিটি হ'ল ডুপ্লিকেট পদ্ধতিটি ম্যোথোথড (ইন্ট) টাইপ করুন ফু।

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