আমার এখানে কেন কোন পূর্ণসংখ্যার (ইন্টি) পূর্ণরূপ দরকার?


122

নিম্নলিখিত উদাহরণে

int i = -128;
Integer i2 = (Integer) i; // compiles

Integer i3 = (Integer) -128; /*** Doesn't compile ***/

Integer i4 = (Integer) (int) -128; // compiles
Integer i4 = -128; // compiles
Integer i5 = (int) -128; // compiles
Integer i6 = (Integer) (-128); // compiles
Integer i7 = (Integer) 0-128; // compiles

আমি নিক্ষেপ করতে পারবে না -128সঙ্গে (Integer)কিন্তু আমি কাস্ট করতে পারেন (int) -128

আমি সবসময় ভাবতাম যে -128এটি intটাইপ এবং এটি (int)ingালাই অনর্থক হওয়া উচিত।

লাইনে ত্রুটিটি i3হ'ল

cannot find symbol variable Integer

আমি জাভা 6 আপডেট 29 এবং জাভা 7 আপডেট 1 দিয়ে এটি চেষ্টা করেছি।

সম্পাদনা: আপনি +128পরিবর্তে একই আচরণ পেতে -128। এটি unary এবং বাইনারি অপারেটরদের মধ্যে বিভ্রান্তি বলে মনে হয়।


5
আপনার সংকলক কি? Integer i = -128;যদিও এটি সংকলন করা উচিত।
বেটসেস

জঞ্জাল, Integer i3 = (Integer) (-128);যদিও মেনে চলে।
ইঞ্জিফুড

2
@ ইঞ্জি.ফুয়াড, পিটার, অবিচ্ছিন্ন প্রতীকগুলির (+ -) ডান থেকে বাম সাহচর্য রয়েছে এবং আরও, বিয়োগ থেকে বাম থেকে ডানদিকে। -128 এর প্রভাব +128 এর মতো হবে এবং 0 টি সামনে রেখে ঠিক করা উচিত, যেমন 0-128 বা 0 + 128। (ক্যান্ট টেস্ট এটিএম তবে আমি বাজি ধরতে পারি)
বেটসেস করুন

ভাল প্রশ্ন! আমি ব্যক্তিগতভাবে আনরি / বাইনারি অপারেটরগুলির রেজোলিউশনের জন্য জেএলএসের রেফারেন্স দেখতে চাই এবং যখন কোনও অভিনেতাকে এক্সপ্রেশন হিসাবে বিবেচনা করা হয়। অন্যথায়, এটি সম্ভবত অন্য সংকলকরা এটিকে ত্রুটি হিসাবে বিবেচনা না করে!
ব্রিঞ্জার 128

1
এছাড়াও এফওয়াইআইআই আমার আইডিইতে যে ত্রুটিটি পাই তা হ'ল Expression expectedযেখানে Integer
ব্রিঞ্জার 128

উত্তর:


151

কম্পাইলার বিয়োগ করার চেষ্টা করে 128থেকে (Integer)ভোটদান পরিবর্তে -128করার Integer()এটি ঠিক করার জন্য যোগ করুন

Integer i3 = (Integer) -128; // doesn't compile
Integer i3 = (Integer) (-128); // compiles

মন্তব্যগুলিতে বোলটক্লকের মতে theালাই intউদ্দেশ্য অনুযায়ী কাজ করে, কারণ এটি একটি সংরক্ষিত শব্দ এবং তাই এটি সনাক্তকারী হিসাবে ব্যাখ্যা করা যায় না, যা আমার কাছে বোধগম্য।

এবং ব্রিঞ্জার 128 জেএলএস রেফারেন্স 15.16 খুঁজে পেয়েছে ।

 CastExpression:
    (PrimitiveType Dims opt ) UnaryExpression
    (রেফারেন্সটাইপ) UnaryExpressionNotPlusMinus

আপনি দেখতে পাচ্ছেন, আদিম ধরণের কাস্টিংয়ের যে কোনও প্রয়োজন হয় UnaryExpression, অন্যদিকে একটি রেফারেন্স টাইপের কাস্টিংয়ের জন্য একটি প্রয়োজন UnaryExpressionNotPlusMinus। এগুলি JLS 15.15 এ কাস্টএক্সপ্রেসের ঠিক আগে সংজ্ঞায়িত করা হয়েছে ।


31
আমি মনে করি এটি intজাভাতে একটি মূলশব্দ বলে, তবে Integerতা নয়। যেহেতু intএকটি কীওয়ার্ড তাই আপনি এটি ভেরিয়েবল বা শ্রেণীর জন্য সনাক্তকারী হিসাবে ব্যবহার করতে পারবেন না, এটি টাইপকাস্ট হওয়ার একমাত্র সম্ভাবনা রেখে leaving এটি এটি ব্যাখ্যা করতে চাই।
BoltClock

উত্তর বল্টক্লক অন্তর্ভুক্ত আপনার মন্তব্য অন্তর্ভুক্ত।
জেনস স্কাউডার

3
এটি আরও উত্সাহী উত্তর করতে, আপনি আমার লিঙ্কটি জেএলএসে যুক্ত করতে চান?
ব্রিঞ্জার 128

3
এই ইস্যুতে একটি আকর্ষণীয় (আমার কাছে) বলি হ'ল আমরা কীভাবে সি # তে অভিন্ন সমস্যাটি সমাধান করব, যা "বাইনারি বিয়োগকারক অপারেটরকে অপারেন্ড হিসাবে প্রথম বন্ধনী হিসাবে প্রকাশিত হওয়া" এবং "কাস্ট অপারেটর যেখানে ডান অপারেন্ডের মধ্যে ব্যাকরণের মধ্যে একটি অস্পষ্টতা রয়েছে has castালাই একটি অবিচ্ছিন্ন বিয়োগ অভিব্যক্তি "। সামঞ্জস্যতা সমাধানের বিষয়ে আমরা চেষ্টা করতে এবং স্মার্ট হওয়ার জন্য ব্যবহার করি এমন হিউরিস্টিক্সের বিশদ বিবরণের জন্য সি # স্পেসিফিকেশনের section.7. See অংশটি দেখুন।
এরিক লিপার্ট

1
@ বিল্ক আপনি এটা কেন বলছেন? সি # স্পেসটি 7..7..6 বিভাগে অপারেটর ওভারলোডিংকে বোঝায় না, সুতরাং এটি তাদের পক্ষে কোনও সমস্যা ছিল না।
ব্রিংগার 128

48

আমি জেএলএস রেফারেন্স পেয়েছি। 15.16

 CastExpression:
    (PrimitiveType Dims opt ) UnaryExpression
    (রেফারেন্সটাইপ) UnaryExpressionNotPlusMinus

আপনি দেখতে পাচ্ছেন, আদিম ধরণের কাস্টিংয়ের যে কোনও প্রয়োজন হয় UnaryExpression, অন্যদিকে একটি রেফারেন্স টাইপের কাস্টিংয়ের জন্য একটি প্রয়োজন UnaryExpressionNotPlusMinus। এগুলি JLS 15.15 এ কাস্টএক্সপ্রেসের ঠিক আগে সংজ্ঞায়িত করা হয়েছে ।

আপনার হয় কাস্টটিকে আদিম ধরণের পরিবর্তন করতে হবে:

... (int) -128;

অথবা আপনি কাস্টের ডানদিকে এক্সপ্রেশনটি একটি অ-প্লাস-বিয়োগ করে আনার্য এক্সপ্রেশনে পরিবর্তন করতে পারেন:

... (Integer) (-128);  // Either
... (Integer) 0 - 128; // Or

12

-সংকলকটি দ্বি-আরগ বিয়োগকারী অপারেটর হিসাবে ব্যাখ্যা করে , অর্থাত্ এটি নামকরণ করা অন্য কোনও সংখ্যা থেকে 128 বিয়োগ করার চেষ্টা করছে Integer, তবে সুযোগে এর মতো কোনও পরিবর্তনশীল নেই।

এটি সংকলন:

Integer i3 = (Integer) (-128)

আপনি কেন (int)একটি পার্থক্য নিয়ে একটি মন্তব্য যুক্ত করতে পারেন ।
পিটার লরে

1
এটি অটোবক্সিংয়ের কারণে, না?
ব্রায়ান রোচ

9

এটি সিনট্যাক্স পার্সিংয়ের সাথে করতে পারে। লক্ষ্য করুন

Integer i4 = (Integer) (-128); 

ঠিক কাজ করে।

সাধারণভাবে, আপনার পূর্ণসংখ্যার শ্রেণিতে কাস্ট করা উচিত নয়। এটিতে অটো-বক্সিং নামক কোনও কিছু জড়িত এবং এটি আপনার কোডে কিছু সূক্ষ্ম ত্রুটি সৃষ্টি করতে পারে। আপনি যা চান তা করার পছন্দের পদ্ধতিটি হ'ল:

Integer i6 = Integer.valueOf(-128)

1
পূর্ণসংখ্যায় কাস্ট করা হুবহু মানের জন্য সিন্থেটিক চিনি।
বেটসেস করুন

4
হ্যাঁ, তবে কখনও কখনও সিন্থেটিক চিনি সূক্ষ্ম উপায়ে ব্যর্থ হয়। অটো-বক্সিংয়ের কারণে বড় অ্যাপ্লিকেশনগুলিতে নাল পয়েন্টার ব্যতিক্রমগুলি সন্ধান করতে আমার কিছুটা কষ্ট হয়েছিল। ভবিষ্যতে মাথাব্যাথা বাঁচানোর জন্য আমরা ত্রুটি হিসাবে অটো-বক্সিংকে চিকিত্সা করতে পেরেছি। যাদুটি দুর্দান্ত, তবে যখন এটি ব্যর্থ হয়, তখন মাথাগুলি ব্যথা হয়। আমি মনে করি স্পষ্ট হয়ে নিজের মাথাব্যাথা বাঁচানো আরও ভাল।
ক্রিশ্চিয়ান সাইবুলস্কি

এনপিই হ'ল বি 1tch ডাব্লু / আউটবক্সিং, সত্য। এনপাই for (int i in Collection<Integer>)/ বি সি এর মতো এসপি ক্ষেত্রে একেবারে অপ্রত্যাশিত অবস্থানে রয়েছে। ক্যাশে রেঞ্জটি ছোট হওয়ায় আমি আসলে ইন্টিজার ডাব্লু / অটোবক্সিং ব্যবহার করি না (তবে এটি ডাব্লু / এক্সএক্স বিকল্প বাড়ানো যেতে পারে) তবে একই জিনিসগুলি করার জন্য ইন্টিজারপ্রাইডার (১.১ থেকে) নামে একটি শ্রেণি রয়েছে। মানচিত্র (java.util থেকে যে কোনও) ব্যবহার করে পূর্ণসংখ্যার-> যেকোনো কিছু সাধারণত তাত্পর্যপূর্ণ ক্ষেত্রে ব্যবহার না করা এবং প্রায়শই সর্বদা এর থেকে আরও ভাল সমাধান না পাওয়া পর্যন্ত একটি পারফরম্যান্স হিট হয়।
বেটসেস করুন

পূর্ণসংখ্যার সাথে int কাস্টিং কখনই কোনও ত্রুটি সৃষ্টি করতে পারে না , সম্ভবত হ্যাপ ওভারফ্লো। বিপরীতটি সত্য নয়, যদিও।
ইঙ্গো

@ ম্যাটবাল, আমি এটি পুরোপুরি পাই না, সিন্থেটিক চিনি ব্যাপকভাবে ব্যবহৃত হয়: Egcorns.lascribe.net/forum/viewtopic.php?id=4400 এবং সিন্থেটিক শব্দ আমার কাছে আরও ভাল।
বেটসেস করুন

9

এটি এটিকে পার্স করছে Integer <minus operator> 128এবং পরিবর্তনশীলটি খুঁজে পাচ্ছে না Integer। আপনার -128ব্র্যাকেটগুলি মোড়ানো দরকার :

Integer i3 = (Integer) (-128);  // compiles

আমি অন্য সমস্ত জবাবগুলিকে +1 প্রদান করেছি কারণ সেগুলিও ঠিক আছে :)
বোহেমিয়ান


6

লাইন 3 এর ব্যাখ্যা করা হয়েছে যেমন আপনি প্রথম বন্ধনীতে এক্সপ্রেশন থেকে 128 বাদ দেওয়ার চেষ্টা করছেন এবং প্রথম বন্ধনীর মধ্যে প্রকাশটি প্রকারের বর্ণ নয় এবং এটি '-' অপারেটর হিসাবে '-' হিসাবে বিবেচনা করে। আপনি যদি অভিব্যক্তিটি এতে পরিবর্তন করেন:

Integer i3 = (Integer) (-128);

তারপরে সংকলকটি বুঝতে পারে '-' হ'ল একাত্ম বিয়োগ যা একটি নেতিবাচক পূর্ণসংখ্যাকে নির্দেশ করে।


3

সি # সংকলকের একই আচরণ রয়েছে। এটি সংকলন করতে কেন ব্যর্থ হয়েছে এটি একটি আরও ভাল ইঙ্গিত দেয়:

নেতিবাচক মান কাস্ট করতে আপনার অবশ্যই মানটি বন্ধনীতে আবদ্ধ করতে হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.