এগুলিকে সাধারণীকরণের ধরণের সীমাবদ্ধতা বলা হয় । তারা আপনাকে টাইপ-প্যারামিটারাইজড ক্লাস বা বৈশিষ্ট্য থেকে শুরু করে এর ধরণের কোনও একটি পরামিতি বাধা দেয় । এখানে একটি উদাহরণ:
case class Foo[A](a:A) { // 'A' can be substituted with any type
// getStringLength can only be used if this is a Foo[String]
def getStringLength(implicit evidence: A =:= String) = a.length
}
অন্তর্নিহিত যুক্তি evidenceসংকলক দ্বারা সরবরাহ করা হয়, if Aহয় String। আপনি একটি যেমন মনে করতে পারেন প্রমাণ যে Aহয় String--দী যুক্তি নিজেই গুরুত্বপূর্ণ নয়, শুধুমাত্র বুদ্ধিমান যে এটি বিদ্যমান। [সম্পাদনা করুন: ভাল, প্রযুক্তিগতভাবে এটি আসলে গুরুত্বপূর্ণ কারণ এটি থেকে অন্তর্নিহিত রূপান্তরকে উপস্থাপন Aকরে String, যা আপনাকে কল করতে a.lengthএবং আপনার কাছে সংকলক চিৎকার না করার অনুমতি দেয় ]
এখন আমি এটি এর মতো ব্যবহার করতে পারি:
scala> Foo("blah").getStringLength
res6: Int = 4
তবে যদি আমি এটি Fooব্যতীত অন্য কোনও কিছু যুক্ত করে ব্যবহার করার চেষ্টা করেছি String:
scala> Foo(123).getStringLength
<console>:9: error: could not find implicit value for parameter evidence: =:=[Int,String]
আপনি সেই ত্রুটিটি পড়তে পারেন "" এমন প্রমাণের সন্ধান পেল না যে অন্তঃ == স্ট্রিং "... এটি যেমন হওয়া উচিত তেমন! সাধারণভাবে যা প্রয়োজন তার চেয়ে ধরণের আরও বিধিনিষেধgetStringLength আরোপ করছে ; যথা, আপনি শুধুমাত্র ডাকা যাবে একটি উপর । এই সীমাবদ্ধতা সংকলন সময়ে প্রয়োগ করা হয়, যা দুর্দান্ত!AFoogetStringLengthFoo[String]
<:<এবং <%<একইভাবে কাজ করুন, তবে কিছুটা ভিন্নতা সহ:
A =:= B মানে A অবশ্যই হ'ল বি
A <:< Bএর অর্থ A অবশ্যই B এর একটি উপপ্রকার হতে হবে ( সাধারণ ধরণের সীমাবদ্ধতার সাথে সমান <:)
A <%< Bএর অর্থ A অবশ্যই বি হিসাবে দেখা যাবে , সম্ভবত অন্তর্নিহিত রূপান্তরের মাধ্যমে (সাধারণ ধরণের সীমাবদ্ধতার সাথে সমান <%)
@ রেট্রোনিমের এই স্নিপেটটি এই ধরণের জিনিস কীভাবে সম্পন্ন হত এবং সাধারণ ধরণের সীমাবদ্ধতাগুলি কীভাবে এখন এটি আরও সহজ করে তোলে তার একটি ভাল ব্যাখ্যা।
অভিযোজ্য বস্তু
আপনার ফলো-আপ প্রশ্নের উত্তর দেওয়ার জন্য, স্বীকারোক্তিপূর্ণ যে উদাহরণটি আমি দিয়েছি তা বেশিরভাগ ক্ষেত্রেই কার্যকর এবং কার্যকরভাবে নয়। তবে কোনও List.sumIntsপদ্ধতির মতো কিছু সংজ্ঞায়িত করতে এটি ব্যবহার করার বিষয়টি কল্পনা করুন , যা পূর্ণসংখ্যার একটি তালিকা যুক্ত করে। আপনি এই পদ্ধতিটি কোনও পুরানোকেই অনুরোধ করার অনুমতি দিতে চান না List, কেবল একটি List[Int]। তবে Listটাইপ কনস্ট্রাক্টর এতটা বাধা দেওয়া যায় না; আপনি এখনও স্ট্রিং, ফু, বার এবং হোয়াটসনের তালিকা পেতে সক্ষম হতে চান। সুতরাং একটি সাধারণ ধরণের সীমাবদ্ধতা রেখে sumInts, আপনি নিশ্চিত করতে পারেন যে কেবলমাত্র সেই পদ্ধতির একটি অতিরিক্ত বাধা রয়েছে যা এটি কেবল একটিতে ব্যবহার করা যেতে পারে List[Int]। মূলত আপনি নির্দিষ্ট ধরণের তালিকার জন্য বিশেষ-ক্ষেত্রে কোডটি লিখছেন।