এগুলিকে সাধারণীকরণের ধরণের সীমাবদ্ধতা বলা হয় । তারা আপনাকে টাইপ-প্যারামিটারাইজড ক্লাস বা বৈশিষ্ট্য থেকে শুরু করে এর ধরণের কোনও একটি পরামিতি বাধা দেয় । এখানে একটি উদাহরণ:
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
আরোপ করছে ; যথা, আপনি শুধুমাত্র ডাকা যাবে একটি উপর । এই সীমাবদ্ধতা সংকলন সময়ে প্রয়োগ করা হয়, যা দুর্দান্ত!A
Foo
getStringLength
Foo[String]
<:<
এবং <%<
একইভাবে কাজ করুন, তবে কিছুটা ভিন্নতা সহ:
A =:= B
মানে A অবশ্যই হ'ল বি
A <:< B
এর অর্থ A অবশ্যই B এর একটি উপপ্রকার হতে হবে ( সাধারণ ধরণের সীমাবদ্ধতার সাথে সমান <:
)
A <%< B
এর অর্থ A অবশ্যই বি হিসাবে দেখা যাবে , সম্ভবত অন্তর্নিহিত রূপান্তরের মাধ্যমে (সাধারণ ধরণের সীমাবদ্ধতার সাথে সমান <%
)
@ রেট্রোনিমের এই স্নিপেটটি এই ধরণের জিনিস কীভাবে সম্পন্ন হত এবং সাধারণ ধরণের সীমাবদ্ধতাগুলি কীভাবে এখন এটি আরও সহজ করে তোলে তার একটি ভাল ব্যাখ্যা।
অভিযোজ্য বস্তু
আপনার ফলো-আপ প্রশ্নের উত্তর দেওয়ার জন্য, স্বীকারোক্তিপূর্ণ যে উদাহরণটি আমি দিয়েছি তা বেশিরভাগ ক্ষেত্রেই কার্যকর এবং কার্যকরভাবে নয়। তবে কোনও List.sumInts
পদ্ধতির মতো কিছু সংজ্ঞায়িত করতে এটি ব্যবহার করার বিষয়টি কল্পনা করুন , যা পূর্ণসংখ্যার একটি তালিকা যুক্ত করে। আপনি এই পদ্ধতিটি কোনও পুরানোকেই অনুরোধ করার অনুমতি দিতে চান না List
, কেবল একটি List[Int]
। তবে List
টাইপ কনস্ট্রাক্টর এতটা বাধা দেওয়া যায় না; আপনি এখনও স্ট্রিং, ফু, বার এবং হোয়াটসনের তালিকা পেতে সক্ষম হতে চান। সুতরাং একটি সাধারণ ধরণের সীমাবদ্ধতা রেখে sumInts
, আপনি নিশ্চিত করতে পারেন যে কেবলমাত্র সেই পদ্ধতির একটি অতিরিক্ত বাধা রয়েছে যা এটি কেবল একটিতে ব্যবহার করা যেতে পারে List[Int]
। মূলত আপনি নির্দিষ্ট ধরণের তালিকার জন্য বিশেষ-ক্ষেত্রে কোডটি লিখছেন।