Generic در جاوا

ناصر نادری | 1394/06/02


بنام خدا .

در این جلسه  از سری مباحث  آموزش جاوا پیشرفته میپردازیم به مبحث پرکاربرد generics در جاوا .

اگه بخوام در چند جمله کاربرد  generic ها روم توضیح بدم باید بگم  یک نوع پیاده سازی یک کلاس و یا یک متد  با انواع ورودی و خروجی  مختلف و تعیین شده در زمان فراخوانی  هست . یعنی راه حلی هست که شما از طریق اون میتونید نوع برگشتی و یا پارامترهای ورودی متد  رو تعیین نکنید  و اون رو بسپرید به زمان فراخوانی .

مثلا شما میتونید یک متد تعریف کنید که یک  لیست رو دریافت کنه و اون رو مرتب کنه و برگردونه فارغ از اینکه عناصر اون لیست چه نوعی دارن . در زمان فراخوانی میتونید اون رو مثلا بایک لیست نوع رشته یا Integer فراخوانی کنید .

متدهای Generic

برای ساخت یک متد generic باید موراد زیر رو در نظر بگیریم .:

- هر متد  generic یک بخش  پارامتر نوع  داره که با دو علامت <>  محصور شده و داخلش میتونیم تعداد این پارامترها رو با کاما از هم جدا کنیم .

-  بخش نوع پارامتر برگشتی که اون هم بین <> محصور هست

- نوع پارامتر ها فقط میتونن از نوع ارجاع باشن و نمحیتونن از انواع اولیه مثل int باشن.

یک مثال از تعریف متد generic :

 package genericmethod;

public class GenericMethod
{
    //یک متد بانوع ورودی آرایه ای از هرنوع و خروجی 
    public static < E > void printArray( E[] inputArray )
{
    //داخل متد عناصر ارایه رو چاپ میکنیم 
    for ( E element : inputArray ){ 
        System.out.printf( "%s ", element );
    }
    System.out.println();
}

public static void main( String args[] )
{
    //تعریف سه آرایه از انواع موجود در جاوا برای استفاده در متد جنریک
    Integer[] intArray = { 1, 2, 3, 4, 5 };
    Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
    Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

    System.out.println( "نتجیه استفاده برای آرایه نوع Integer:" );
    printArray( intArray ); // pass an Integer array

    System.out.println( "\nنتیجه متد برای آرایه نوع ِ Double:" );
    printArray( doubleArray ); // pass a Double array

    System.out.println( "\n نتیجه متد برای ارایه نوع کاراکتری:" );
    printArray( charArray ); // pass a Character array
  } 
} 

نتیجه اجرای کد بالا :

 نتجیه استفاده برای آرایه نوع Integer:
1 2 3 4 5 

نتیجه متد برای آرایه نوع ِ Double:
1.1 2.2 3.3 4.4 

نتیجه متد برای ارایه نوع کاراکتری:
H E L L O  

ملاحظه میکنید  که متد رو برای انواع Integer و Double و Chrarcter راخوانی کردیم ...

میتونیم انواع قابل پذیرش برای متد یا کلاس رو محدود کنیم مثلا میتونیم که مقادیر فقط عددی باشن یا اینکه  از نوع قابل مقایسه باشن :

 package genericmethod;

public class GenericMethod
{
    // فقط اجازه انواعی رو که قابل مقایسه هستن رو میده
    public static <T extends Comparable<T>> T maximum(T x, T y, T  z)
    { 
        //متدی که برای تعیین بزرگترین مقدار از بین سه پارامتر استفاده میشه 
        T max = x; // assume x is initially the largest 
        if ( y.compareTo( max ) > 0 ){
            max = y; // y is the largest so far
        }
        if ( z.compareTo( max ) > 0 ){
            max = z; // z is the largest now 
        }
        return max; // returns the largest object 
    }
    public static void main( String args[] )
    {
        System.out.printf( "Max of %d, %d and %d is %d\n\n", 
        3, 4, 5, maximum( 3, 4, 5 ) );
    
        System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n",
        6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );

        System.out.printf( "Max of %s, %s and %s is %s\n","php",
        "java", "javascript", maximum( "php", "java", "javascript" ) );
    }
} 

نتیجه اجرای کد بالا :»

 Max of 3, 4 and 5 is 5

Maxm of 6.6,8.8 and 7.7 is 8.8

Max of php, java and javascript is php 

ملاحظه میکنید که در هنگام تعریف متد تعیین بزرگترین مقدا با بلاک <T extends Comparable<T>> در واقع به کامپایلرگفتیم فقط انواعی رو که قابل مقایسه هستن قبول کن .

کلاسهای Generic :

تعریف کلاس از نوع generic بسیار ساده هست . مفهوم کلاس نوع generic این هست  که ما نوع یا انواعی رو در زمان فراخوانی کلاس بهش ارسال کنیم که داخل کلاس ازش استفاده بشه و به این ترتیب کلاسی داریم که توی بدنش یک نوع دینامیک هست یعنی یک کلاس با بدنه ای  که میتونه انواع مختلف و عکس العمل های مختلفی داشته باشه .

 public class Box<T> {

    //استفاده از نوع پارامتر پویا T
    private T t;

    //استفاده از نوع پارامتر پویا T در تعریف متد
    public void add(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }

} 

استفاده از کلاس بالا :

  public static void main(String[] args) {
    Box<Integer> integerBox = new Box<Integer>();
    Box<String> stringBox = new Box<String>();

    integerBox.add(new Integer(10));
    stringBox.add(new String("Hello World"));

    System.out.printf("Integer Value :%d\n\n", integerBox.get());
    System.out.printf("String Value :%s\n", stringBox.get());
} 

نتیجه اجرای کد بالا :

 Integer Value :10
String Value :Hello World 


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید