(برنامه نویسی JAVA) تبدیل غیر  خودکار   انواع   ناسازگار 

(conversions narrowing )  (رباتیک _ الکترونیک)

پژوهشگر و نویسنده: (  افشین رشید )

نکته: اگر چه تبدیلات خودکار انواع بسیار سودمند هستند ، اما جوابگوی همه نیازها نیستند . بعنوان مثال ، ممکن است بخواهیـد یـک مقـدار int را به یک متغیر byte نسبت دهید. این تبدیل بطور خودکار انجام نمی گیرد، زیرا یک byte از int ز کـوچکتر اسـت . ایـن نـوع خاص از تبدیلات را گاهی تبدیل باریک کننـده (conversions narrowing ) مـی نامنـد.

 زیـرا بطـور صـریح مقـدار را  آنقـدر باریک تر و کم عرض تر می کنید تا با نوع هدف سازگاری یابد . برای ایجاد یک تبدیل بین دو نوع ناسازگار ، بایـد از cast اسـتفاده نمایید cast . یک تبدیل نوع کاملا" صریح است .- target نوع و  نوع مقصد یا هدف در اینجا نوع هدف ، همان نوعی است که مایلیم مقدار مشخص شده را به آن تبدیل کنیم . بعنوان مثال ، قطعه زیر از یک برنامه تبدیل غیر خودکار ازint به byte را اجرا می کند . اگر مقدار integer بزرگتراز دامنه یک byte باشد ، این مقدار به مدول( باقیمانده تقسیم یک integer بر دامنه (byte ) کاهش خواهد یافت

;a int . 

 byte b;

 //... 

b =( byte )a;

هر گاه که یک مقدار اعشاری به یک عدد صحیح نسبت داده شود ، شکل دیگری از تبدیل اتفاق می افتـد : بریـدن ، . truncation همانطوریکه می دانیـد ، اعـداد صـحیح دارای قسـمت اعشـاری نیسـتند . بنـابراین هنگامیکـه یـک مقـدار اعشـاری بـه یـک نـوع عـدد صحیح نسبت داده می شود ، جزی اعشاری از بین خواهد رفت ( بریده خواهد شد) 

class Test {			
    public static void main(String[] args) {
        // Casting conversion (5.4) of a float literal to
        // type int. Without the cast operator, this would
        // be a compile-time error, because this is a
        // narrowing conversion (5.1.3):
        int i = (int)12.5f;

        // String conversion (5.4) of i's int value:
        System.out.println("(int)12.5f==" + i);

        // Assignment conversion (5.2) of i's value to type
        // float. This is a widening conversion (5.1.2):
        float f = i;

        // String conversion of f's float value:
        System.out.println("after float widening: " + f);

        // Numeric promotion (5.6) of i's value to type
        // float. This is a binary numeric promotion.
        // After promotion, the operation is float*float:
        System.out.print(f);
        f = f * i;

        // Two string conversions of i and f:
        System.out.println("*" + i + "==" + f);

        // Invocation conversion (5.3) of f's value
        // to type double, needed because the method Math.sin
        // accepts only a double argument:
        double d = Math.sin(f);

        // Two string conversions of f and d:
        System.out.println("Math.sin(" + f + ")==" + d);
    }
}

 ( بعنوان مثال ، اگر مقدار 23.1 را بـه یـک عـدد صحیح نسبت دهـیم ، مقـدار حاصـله فقـط عـدد 1 مـی باشـد . مقـدار 23.0 بریـده (truncated) خواهـد شـد . البتـه اگـر انـدازه اجزای عدد کلی آنچنان بزرگ باشد که در نوع عدد صحیح مقصد نگنجد ، آنگاه مقدار فوق به مدول دامنه نوع هـدف کـاهش خواهـد یافت.

نویسنده: (افشین رشید )