توابع جنریک

اگر بخواهید چندین تابع با عملکرد مشابه ایجاد کنید و فقط تفاوت آنها در نوع داده‌ای باشد که قبول می‌کنند (مثلاً یکی نوع Int و دیگری نوع Double را قبول کند) می‌توانید از توابع جنریک برای صرفه جویی در کدنویسی استفاده نمایید. ساختار عمومی یک تابع جنریک به شکل زیر است :

fun <type> functionName(argument1: type)
{
    //type someVariable;
}

مشاهده می‌کنید که بعد از کلمه کلیدی fun یک نوع در داخل دو علامت بزرگتر و کوچکتر آمده است ( <type> ) که همه انواع در کاتلین می‌توانند جایگزین آن شوند. برنامه زیر مثالی از نحوه استفاده از تابع جنریک می‌باشد :

  1: fun <X> show(`val`: X)
  2: {                     
  3:     println(`val`)    
  4: }                     
  5: 
  6: fun main(args: Array<String>)
  7: {
  8:     var intValue: Int       = 5
  9:     var doubleValue: Double = 10.54
 10:     var stringValue: String = "Hello"
 11:     var boolValue: Boolean  = true
 12: 
 13:     show(intValue)
 14:     show(doubleValue)
 15:     show(stringValue)
 16:     show(boolValue)
 17: }
5
10.54
Hello
true

یک تابع جنریک ایجاد کرده‌ایم که هر نوع داده‌ای را قبول کرده و مقادیر آنها را نمایش می‌دهد (خطوط 4-1). سپس داده‌های مختلفی با وظایف یکسان به آن ارسال می‌کنیم. تابع نیز نوع X را بسته به نوع داده‌ای که به عنوان آرگومان ارسال شده است تغییر می‌دهد. به عنوان مثال وقتی یک داده از نوع Int ارسال می‌کنیم، همه مکانهایی که X در آنها وجود دارد به Int تبدیل می‌شوند و تابع به صورت زیر در می‌آید :

fun <Int> show(`val`: Int)
{
    println(`val`);
}

به یک نکته در مورد استفاده از تابعهای جنریک توجه کنید و آن این است که شما نمی‌توانید در داخل کدهای مربوط به تابع محاسبات انجام دهید مثلاً دو عدد را با هم جمع کنید چون کامپایلر نمی‌تواند نوع واقعی عملوندها را تشخیص دهد، ولی به سادگی می‌توان مقادیر را در داخل تابع نشان داد چون کامپایلر هر نوع داده‌ای را که توسط تابع println() استفاده می‌شود را می‌تواند تشخیص دهد.

fun <X> show(`val1`: X, `val2`: X)
{
    println(`val1` + `val2`)
}

شما می‌توانید چندین نوع خاص را برای تابع جنریک ارسال کنید، برای این کار هر نوع را به وسیله کاما از دیگری جدا کنید.

fun <X, Y> show(val1: X, val2: Y)
{
    println(val1)
    println(val2)
}

به مثال زیر که در آن دو مقدار مختلف به تابع ارسال شده است توجه کنید :

show(5, true);

مشاهده می‌کنید که X با نوع Int و Y با نوع Boolean جایگزین می‌شود. این نکته را نیز یادآور شویم که شما می‌توانید دو آرگومان هم نوع را هم به تابع ارسال کنید :

show(5, 10);