যেহেতু এখানে অনেক উত্তর ভাল ::
আচরণের ব্যাখ্যা করেছে, সেই সাথে আমি স্পষ্ট করে বলতে চাই যে ::
অপারেটরের উল্লেখ ফাংশনাল ইন্টারফেসের মতো হস্তক্ষেপের প্রয়োজন নেই যদি এটি উদাহরণের ভেরিয়েবলের জন্য ব্যবহৃত হয় । অনুমান আমরা প্রয়োজন দেয় BinaryOperator যা ধরণ হয়েছে TestObject । গতানুগতিক উপায়ে এটি এর মতো প্রয়োগ করা হয়েছে:
BinaryOperator<TestObject> binary = new BinaryOperator<TestObject>() {
@Override
public TestObject apply(TestObject t, TestObject u) {
return t;
}
};
আপনি বেনামে বাস্তবায়নে দেখেন এটির জন্য দুটি টেস্টোবজেক্ট আর্গুমেন্টের প্রয়োজন হয় এবং টেস্টোবজেক্ট অবজেক্টটিও প্রদান করে। ::
অপারেটর ব্যবহার করে এই শর্তটি পূরণ করার জন্য আমরা একটি স্থিতিশীল পদ্ধতি দিয়ে শুরু করতে পারি:
public class TestObject {
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
এবং তারপরে কল করুন:
BinaryOperator<TestObject> binary = TestObject::testStatic;
ঠিক আছে এটি জরিমানা সংকলন। আমাদের যদি একটি উদাহরণ পদ্ধতি প্রয়োজন তবে কী হবে? উদাহরণ পদ্ধতি সহ টেস্টবজেক্টটি আপডেট করতে দেয়:
public class TestObject {
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
এখন আমরা নীচের হিসাবে উদাহরণ অ্যাক্সেস করতে পারেন:
TestObject testObject = new TestObject();
BinaryOperator<TestObject> binary = testObject::testInstance;
এই কোডটি জরিমানা সংকলন করে, তবে একটির নীচে নয়:
BinaryOperator<TestObject> binary = TestObject::testInstance;
আমার গ্রহণ আমাকে বলুন "টেস্টঅবজেক্ট টাইপ থেকে অ স্থির পদ্ধতি টেস্টআইনস্ট্যান্স (টেস্টওজেক্ট, টেস্টঅবজেক্ট) এর স্থিতিশীল রেফারেন্স তৈরি করা যায় না ..."
যথেষ্ট উদাহরণস্বরূপ পদ্ধতিটি যথেষ্ট, তবে আমরা যদি testInstance
নীচের মতো ওভারলোড করি :
public class TestObject {
public final TestObject testInstance(TestObject t){
return t;
}
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
এবং কল করুন:
BinaryOperator<TestObject> binary = TestObject::testInstance;
কোডটি ঠিক জরিমানা সংকলন করবে। কারণ এটি testInstance
ডাবল একের পরিবর্তে একক প্যারামিটার দিয়ে কল করবে । ঠিক আছে তো আমাদের দুটি পরামিতি কী হল? প্রিন্টআউট এবং দেখুন:
public class TestObject {
public TestObject() {
System.out.println(this.hashCode());
}
public final TestObject testInstance(TestObject t){
System.out.println("Test instance called. this.hashCode:"
+ this.hashCode());
System.out.println("Given parameter hashCode:" + t.hashCode());
return t;
}
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
যা আউটপুট দেবে:
1418481495
303563356
Test instance called. this.hashCode:1418481495
Given parameter hashCode:303563356
ঠিক আছে সুতরাং জেভিএম প্যারাম 1.টেস্টআইনস্ট্যান্স (প্যারাম 2) কল করার জন্য যথেষ্ট স্মার্ট। আমরা testInstance
অন্য সংস্থান থেকে টেস্টবজেক্ট নয়, ব্যবহার করতে পারি , যেমন:
public class TestUtil {
public final TestObject testInstance(TestObject t){
return t;
}
}
এবং কল করুন:
BinaryOperator<TestObject> binary = TestUtil::testInstance;
এটি কেবল সংকলন করবে না এবং সংকলক বলবে: "টাইপ টেস্টUtil টেস্টইনস্ট্যান্স (টেস্টঅবজেক্ট, টেস্টঅবজেক্ট) সংজ্ঞায়িত করে না" । সুতরাং সংকলক স্থির রেফারেন্সটি সন্ধান করবে যদি এটি একই ধরণের না হয়। ঠিক আছে বহুবর্ষ সম্পর্কে কি? যদি আমরা চূড়ান্ত সংশোধনকারীগুলি সরিয়ে এবং আমাদের সাবটস্টঅবজেক্ট শ্রেণি যুক্ত করি:
public class SubTestObject extends TestObject {
public final TestObject testInstance(TestObject t){
return t;
}
}
এবং কল করুন:
BinaryOperator<TestObject> binary = SubTestObject::testInstance;
এটি পাশাপাশি সংকলন করবে না, সংকলক এখনও স্থির রেফারেন্স খুঁজবে। তবে নীচের কোডটি সূক্ষ্ম সংকলন করবে যেহেতু এটি উত্তীর্ণ হচ্ছে-একটি পরীক্ষা:
public class TestObject {
public SubTestObject testInstance(Object t){
return (SubTestObject) t;
}
}
BinaryOperator<TestObject> binary = TestObject::testInstance;
* আমি কেবল অধ্যয়ন করছি তাই আমি চেষ্টা করে দেখেছি এবং ভুল হয়ে থাকলে আমাকে সংশোধন করতে দ্বিধা বোধ করি