কোন অবজেক্টকে কোন ইনটকে কাস্ট করা যায়


221

আমি জাভাতে কোন অবজেক্টকে কাস্ট করতে পারি?


6
আপনি কি সত্যিই কাজ করতে চান? যদি এটি Objectনা হয় তবে Integerআমি নিশ্চিত নই যে আপনি আপনার অভিনেতার কাছ থেকে কী প্রত্যাশা করছেন।
আনহোলিস্যাম্পলার

2
উদাহরণস্বরূপ কীওয়ার্ড সহ প্রথম পরীক্ষা করুন। যদি সত্য হয় তবে এটি নিক্ষেপ করুন
ডেড প্রোগ্রামার

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

@ টোম্যাজাতো আপনি এটি করতে পারেন (সাজান), পূর্ণসংখ্যার মান ধরে রাখার জন্য আপনার এনামের একটি ক্ষেত্রের সংজ্ঞা দিন (বলুন intValue), আপনার এনামের জন্য একটি কনস্ট্রাক্টর তৈরি করুন যা সেট করে intValue, আপনার এনাম কনস্ট্যান্টস সেই কনস্ট্রাক্টরকে অনুরোধ করতে এবং একটি গিটার যোগ করতে জন্য intValue। তারপরে, ingালাইয়ের পরিবর্তে, গেটকে কল করুন।
ব্রায়ান ম্যাকচ্যাটন

উত্তর:


385

আপনি যদি নিশ্চিত হন যে এই বস্তুটি একটি Integer:

int i = (Integer) object;

অথবা, জাভা 7 থেকে শুরু করে আপনি সমানভাবে লিখতে পারেন:

int i = (int) object;

সাবধান, এটি একটি নিক্ষেপ করতে পারেন ClassCastExceptionযদি আপনার বস্তু একটি নয় Integerএবং NullPointerExceptionযদি আপনার অবজেক্ট null

এইভাবে আপনি ধরে নিচ্ছেন যে আপনার অবজেক্টটি একটি পূর্ণসংখ্যা (মোড়কানো ইনট) এবং আপনি এটি কোনও ইন-বাক্সে আনবক্স করেন।

intএটি একটি আদিম, তাই এটি হিসাবে সংরক্ষণ করা যায় না Object, একমাত্র উপায় হ'ল একটি intবিবেচিত / বাক্সযুক্ত হিসাবে একটি Integerহিসাবে সংরক্ষণ করা হয় Object


যদি আপনার অবজেক্টটি একটি হয় String, তবে আপনি Integer.valueOf()পদ্ধতিটি এটিকে একটি সাধারণ ইনটে রূপান্তর করতে ব্যবহার করতে পারেন :

int i = Integer.valueOf((String) object);

এটি NumberFormatExceptionযদি আপনার Stringবিষয়বস্তু হিসাবে কোনও পূর্ণসংখ্যার সাথে সত্যই বস্তু না হয় তবে এটি ফেলে দিতে পারে ।


সংস্থানসমূহ:

একই বিষয়ে:


নালপয়েন্টার এক্সসেপশন সম্পর্কে আপনি কি নিশ্চিত? আমি ভেবেছিলাম যে নাল অবজেক্টটি কেবল নাল পূর্ণসংখ্যা দেবে ....
এটিয়েন ডি মার্টেল

7
NullPointerExceptionএর আনবক্সিং সময় ঘটবে Integerমধ্যেint
কলিন Hebert

আপনি কোনও ইন্টিতে কাস্টিং করছেন না, কোনও অবজেক্ট কোনও ইন্টিতে কখনও কাস্ট করা যাবে না। আপনি প্রকৃতপক্ষে পূর্ণসংখ্যার এবং তারপরে একটি ইনট-এ স্বয়ংক্রিয়ভাবে ox
স্টিভ কুও

1
@ স্টিভ কুও, হ্যাঁ, ঠিক আমি যা বলছি। এজন্য আমি "কাস্ট" শব্দটি ব্যবহার করিনি।
কলিন হেবার্ট

@ এটিয়েন: আপনি একটি পূর্ণসংখ্যার কাছে একটি নাল বস্তু নিক্ষেপ করতে পারেন, এভাবে নাল পূর্ণসংখ্যা পাওয়া যাবে। আপনি যখন এটি থেকে ইনট বের করার চেষ্টা করবেন তখন আপনি একটি নাল পয়েন্টার ব্যতিক্রম পাবেন। "নাল ইন্ট" বলে কোনও জিনিস নেই।
জয়

18

অবজেক্টটি একটি বস্তু হিসাবে ধরে নেওয়া Integer, তারপরে আপনি এটি করতে পারেন:

int i = ((পূর্ণসংখ্যা) আপত্তি) .intValue ();

যদি বস্তুটি কোনও Integerঅবজেক্ট না হয় , তবে আপনাকে প্রকারটি সনাক্ত করতে হবে এবং এর ধরণের ভিত্তিতে রূপান্তর করতে হবে।


যদি আপত্তি নাল হয় তবে এটি নালপয়েন্টারএক্সসেপশন নিক্ষেপ করবে।
কলিন হেবার্ট

এবং এটি কোনও পূর্ণসংখ্যার অবজেক্ট না হলে ক্লাসকাস্টএক্সেপশন।
এরিক রবার্টসন

1
intValueঅটোবক্সিংয়ের জন্য অনুরোধ করার দরকার নেই এটি আপনার জন্য প্রার্থনা করবে।
অস্কারলাইজ

1
intValueবিশেষত intএর সাথে বিনিময়যোগ্য হওয়ার মধ্যে প্রাথমিক বিভ্রান্তি বিবেচনা করা আরও স্পষ্ট Integer
স্টিভ কুও

14

পরিস্থিতি 1: সাধারণ মামলা

যদি এটির নিশ্চয়তা থাকে যে আপনার অবজেক্টটি একটি Integer, তবে এটি সহজ উপায়:

int x = (Integer)yourObject;

পরিস্থিতি 2: যে কোনও সংখ্যক বস্তু

জাভা Integer, Long, BigIntegerইত্যাদি সব বাস্তবায়ন Numberইন্টারফেস যা একটি পদ্ধতি নাম দিয়েছে intValue। সংখ্যাসূচক দিক সহ যে কোনও কাস্টম প্রকারেরও প্রয়োগ করা উচিত Number(উদাহরণস্বরূপ Age implements Number:)। তাই আপনি পারেন:

int x = ((Number)yourObject).intValue();

দৃশ্য 3: সংখ্যার পাঠ্যকে পার্স করুন

আপনি যখন কমান্ড লাইন (বা পাঠ্য ক্ষেত্র ইত্যাদি) থেকে ব্যবহারকারী ইনপুট গ্রহণ করেন আপনি এটি হিসাবে পাবেন String। এই ক্ষেত্রে আপনি ব্যবহার করতে পারেন Integer.parseInt(String string):

String input = someBuffer.readLine();
int x = Integer.parseInt(input);

আপনি যদি ইনপুট হিসাবে পান তবে আপনি Objectএটি ব্যবহার করতে পারেন (String)inputবা এটিতে অন্য পাঠ্য টাইপ থাকতে পারে input.toString(),:

int x = Integer.parseInt(input.toString());

দৃশ্য 4: পরিচয় হ্যাশ

জাভাতে কোনও পয়েন্টার নেই। তবে Objectএর জন্য একটি পয়েন্টারের মতো ডিফল্ট বাস্তবায়ন রয়েছে hashCode(), যা সরাসরি মাধ্যমে উপলব্ধ System.identityHashCode(Object o)। তাই আপনি পারেন:

int x = System.identityHashCode(yourObject);

মনে রাখবেন যে, এই হল না একটি বাস্তব পয়েন্টার মান। বস্তুর মেমরি ঠিকানা JVM দ্বারা তাদের পরিচয় হ্যাশ রাখার সময় পরিবর্তন করা যেতে পারে। এছাড়াও, দুটি জীবন্ত বস্তুর একই পরিচয় হ্যাশ থাকতে পারে।

আপনি এটি ব্যবহার করতে পারেন object.hashCode()তবে এটি টাইপ নির্দিষ্ট হতে পারে।

দৃশ্য 5: অনন্য সূচক

একই ক্ষেত্রে আপনার প্রতিটি বস্তুর জন্য একটি অনন্য সূচক প্রয়োজন, যেমন একটি ডাটাবেস টেবিলের স্বয়ংক্রিয় বর্ধিত আইডি মানগুলি (এবং সনাক্তকরণের হ্যাশ থেকে পৃথক যা অনন্য নয়)। এর জন্য একটি সাধারণ নমুনা বাস্তবায়ন:

class ObjectIndexer {

    private int index = 0;

    private Map<Object, Integer> map = new WeakHashMap<>();

    public int indexFor(Object object) {
        if (map.containsKey(object)) {
            return map.get(object);
        } else {
            index++;
            map.put(object, index);
            return index;
        }
    }

}

ব্যবহার:

ObjectIndexer indexer = new ObjectIndexer();
int x = indexer.indexFor(yourObject);    // 1
int y = indexer.indexFor(new Object());  // 2
int z = indexer.indexFor(yourObject);    // 1

পরিস্থিতি 6: এনাম সদস্য

জাভা এনামে সদস্যরা পূর্ণসংখ্যক নয় তবে পূর্ণ বৈশিষ্ট্যযুক্ত বস্তু হয় (উদাহরণস্বরূপ সি / সি ++ এর বিপরীতে)। সম্ভবত কোনও এনাম অবজেক্টে রূপান্তর করার প্রয়োজন নেই int, তবে জাভা স্বয়ংক্রিয়ভাবে প্রতিটি এনাম সদস্যের সাথে একটি সূচক নম্বর যুক্ত করে। এই সূচকটি মাধ্যমে প্রবেশ করা যেতে পারে Enum.ordinal(), উদাহরণস্বরূপ:

enum Foo { BAR, BAZ, QUX }

// ...

Object baz = Foo.BAZ;
int index = ((Enum)baz).ordinal(); // 1

এখানে চিত্র বর্ণনা লিখুন


13
@Deprecated
public static int toInt(Object obj)
{
    if (obj instanceof String)
    {
         return Integer.parseInt((String) obj);
    } else if (obj instanceof Number)
    {
         return ((Number) obj).intValue();
    } else
    {
         String toString = obj.toString();
         if (toString.matches("-?\d+"))
         {
              return Integer.parseInt(toString);
         }
         throw new IllegalArgumentException("This Object doesn't represent an int");
    }
}

আপনি দেখতে পাচ্ছেন যে এটি এটি করার খুব কার্যকর উপায় নয়। আপনার কী ধরণের অবজেক্ট রয়েছে তা সম্পর্কে আপনাকে অবশ্যই নিশ্চিত হতে হবে। তারপরে এটিকে সঠিক উপায়ে রূপান্তর করুন।


এটি কি ডেপ্রেসিটেড নয় (ই এর পরে)? :) দুর্দান্ত পদ্ধতি যদিও অবজেক্টের ধরণ সম্পর্কে কোনও অনুমান করে না।
এক্সট্রেনন

যাইহোক, আপনার রেজেক্স র‌্যাডিক্স হেক্স বা অক্টকে অ্যাকাউন্টে নেয় না। টোইন্ট একটি স্মার্ট পদ্ধতি। নাম্বার ফরম্যাটএক্সসেপশন চেষ্টা করার চেষ্টা করুন Bet
এক্সট্রাওন

4

আপনাকে এটি একটি পূর্ণসংখ্যার (ইন এর র‌্যাপার ক্লাস) কাস্ট করতে হবে। তারপরে আপনি অভ্যন্তরের অন্তর্নির্মিততা অর্জনের জন্য পূর্ণসংখ্যার intValue () পদ্ধতিটি ব্যবহার করতে পারেন।


4

উত্তর:

int i = ( Integer ) yourObject;

যদি, আপনার অবজেক্টটি ইতিমধ্যে একটি পূর্ণসংখ্যা হয়, তবে এটি সহজেই চলবে। অর্থাৎ,

Object yourObject = 1;
//  cast here

অথবা

Object yourObject = new Integer(1);
//  cast here

প্রভৃতি

যদি আপনার অবজেক্টটি অন্য কিছু হয় তবে আপনাকে প্রথমে এটি (যদি সম্ভব হয়) কোনও ইনট এ রূপান্তর করতে হবে:

String s = "1";
Object yourObject = Integer.parseInt(s);
//  cast here

অথবা

String s = "1";
Object yourObject = Integer.valueOf( s );
//  cast here

4

আমি জিএসএন থেকে ডেটা প্রক্রিয়াকরণের সময় একটি ওয়ান-লাইনার ব্যবহার করি:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;

এটি একটি দীর্ঘ প্রক্রিয়া। Double.valueOf (অবজেক্ট.টোস্ট্রিং ()) এর পরিবর্তে কেবলমাত্র (int) অবজেক্টটি করুন do intValue () । এটি কেবলমাত্র সংখ্যার জন্যই কাজ করে, যা আমাদের প্রয়োজন।
সুধাকর কৃষ্ণন

1
@ সুধাকরক: (অন্তঃ) অবজেক্টটি কেবল তখনই কাজ করে যদি আপনার অবজেক্টটি পূর্ণসংখ্যা হয়। এই অনেলাইনার স্ট্রিং নম্বরগুলিও সমর্থন করে; EG "332"।
জ্যাকব ভ্যান লিনজেন

2

যদি Objectপ্রাথমিকভাবে এটি হিসাবে ইনস্ট্যান্ট করা হয় Integer, তবে আপনি intএটি কাস্ট অপারেটরের সাহায্যে ডাউনকাস্ট করতে পারেন (Subtype)

Object object = new Integer(10);
int i = (Integer) object;

নোট এই শুধুমাত্র কাজ করে যখন আপনার সাথে অন্তত জাভা 1.5 ব্যবহার করছেন যে বৈশিষ্ট্য autoboxing , অন্যথায় আপনার কি ডিক্লেয়ার করার আছে iযেমন Integerপরিবর্তে এবং তারপর কল intValue()এটা

তবে যদি প্রাথমিকভাবে এটি একেবারে তৈরি না করা Integerহয়, তবে আপনি সেভাবে হ্রাস পেতে পারেন না। এটির ClassCastExceptionবার্তায় মূল শ্রেণিকামের ফলাফল হবে । যদি অবজেক্টের toString()প্রাপ্ত হিসাবে উপস্থাপনাটি String#valueOf()সিন্ট্যাক্টিক্যালি বৈধ পূর্ণসংখ্যার সংখ্যাটি বোঝায় (উদাহরণস্বরূপ অঙ্কগুলি, যদি সামনে বিয়োগ চিহ্ন সহ প্রয়োজন হয়) তবে আপনি ব্যবহার করতে পারেন Integer#valueOf()বা এর new Integer()জন্য।

Object object = "10";
int i = Integer.valueOf(String.valueOf(object));

আরো দেখুন:



2

করা যায় না। একটি intকোনও বস্তু নয়, এটি একটি আদিম ধরণের। আপনি এটি পূর্ণসংখ্যার মধ্যে কাস্ট করতে পারেন, তারপরে তথ্য পাবেন।

 Integer i = (Integer) o; // throws ClassCastException if o.getClass() != Integer.class

 int num = i; //Java 1.5 or higher

এটি ধরে নিয়েছে যে অবজেক্টটি একটি পূর্ণসংখ্যা যা এটি প্রায় অবশ্যই নয়। সম্ভবত চান স্ট্রিং সমাধান আলা করোনটস
বিল কে

আপনি যখন কোনও বস্তুকে অবজেক্টে কাস্ট করছেন এবং তারপরে এটি একটি পূর্ণসংখ্যা পরিবর্তনশীলতে সেট করার চেষ্টা করছেন তখন এটি কীভাবে সংকলন করতে পারে।
কার্লোস

2

আপনি পারবেন না। আন intএকটি নয় Object

Integerএকটি হল Objectযদিও, কিন্তু আমি সন্দেহ আপনি কি বলতে চাইছেন না।


জাভা 5 এর পর থেকে অটো বক্সিং / আনবক্সিং রয়েছে
ব্রুনো

@ ব্রুনো: আপনি কোনও অবজেক্টকে কোন প্রকারে ফেলে দিতে পারবেন না। আপনি একটি পূর্ণসংখ্যার জন্য একটি অবজেক্ট কাস্ট করতে পারেন এবং তারপরে এটি কোনও ইনটকে অর্পণ করতে পারেন এবং এটি ম্যাজিকালি স্বতঃবক্স করবে। তবে আপনি কোনও অবজেক্টকে কোন int এ কাস্ট করতে পারবেন না।
জয়

(অব্যাহত) ব্যক্তিগতভাবে, আমি মনে করি লোকেরা অটোবক্সিংয়ের উপর নির্ভর করে প্রচুর বাজে কোড তৈরি করে। যেমন, আমি অন্য দিন একটি বিবৃতি দেখেছি, "ডাবল পরিমাণ = (Double.parseDouble (স্ট্রিংঅ্যামাউন্ট))। ডাবলভ্যালু ();"। অর্থাত্, তিনি একটি স্ট্রিংকে দ্বৈত আদিম পেতে পার্স করেছেন, তারপরে এইটির বিরুদ্ধে একটি ফাংশন কার্যকর করেছিলেন, যা সংকলকটিকে এটি একটি ডাবল বস্তুতে অটোবক্স করতে বাধ্য করেছিল, তবে ফাংশনটি ডাবলভ্যালু যা ডাবল আদিমকে বের করেছিল, যা তিনি তার পরে একটি ডাবলকে অর্পণ করেছিলেন বস্তু এইভাবে একটি অটোবক্স জোর করে। অর্থাৎ, তিনি আদিম থেকে বস্তুকে আদিতে রূপান্তরিত করেছেন, 3 রূপান্তর করেছেন।
জে

@ জে, প্রথম মন্তব্যে একমত হয়েছেন (দুঃখিত আমি নিজেকে পরিষ্কার করিনি) অনেকগুলি রূপান্তর সম্পর্কে, আপনিও ঠিক বলেছেন, তবে আমি অনুভব করি যে জেআইটি সংকলক যথেষ্ট ভালভাবে এটি মোকাবেলা করতে পারে, তাই অনুশীলনে এতটা গুরুত্ব দেওয়া উচিত নয় (এটি অবশ্যই খারাপ কোডের অজুহাত হিসাবে তৈরি করবে না) ...)
ব্রুনো

1
@ ব্রুনো এটি অটোবক্সিংয়ের কৌশলটি এটি আপনাকে অপ্রত্যাশিত নলপয়েন্টারএক্সেপশন দিতে পারে।
এক্সট্রেইন

1

যদি আপনি কোনও স্ট্রিং টু ইনট করতে চান, ব্যবহার করুন Integer.valueOf("123")

আপনি যদিও বেশিরভাগ অন্যান্য অবজেক্টগুলিকে ইন্টি কাস্ট করতে পারবেন না কারণ তাদের কোনও মান মূল্য থাকবে না। যেমন একটি এক্সএমএল ডকুমেন্টের কোনও মান নেই int


1
Integer.valueOf("123")পরিবর্তে আপনার প্রয়োজনীয় সমস্ত আদি ব্যবহার হিসাবে ব্যবহার করবেন না Integer.parseInt("123")কারণ মান ওফ পদ্ধতিটি অপ্রয়োজনীয় আনবক্সিংয়ের কারণ।
কেরেম বায়ডোয়ান

1

আমার ধারণা, আপনি কেন ভাবছেন যে সি বা সি ++ আপনাকে কোনও সংখ্যার মতো কোনও অবজেক্ট পয়েন্টার ম্যানিপুলেট করতে দেয় তবে আপনি জাভাতে কোনও অবজেক্ট রেফারেন্স একইভাবে ম্যানিপুলেট করতে পারবেন না।

জাভা অবজেক্ট রেফারেন্স C অথবা সি পয়েন্টার মত নয় ++, ... পয়েন্টার মূলত হয় পূর্ণসংখ্যার এবং আপনি তাদের অন্য কোন int মত নিপূণভাবে পারবেন না। রেফারেন্সগুলি ইচ্ছাকৃতভাবে আরও কংক্রিট বিমূর্ততা এবং পয়েন্টাররা যেভাবে পারে তা হেরফের করা যায় না।


1
int[] getAdminIDList(String tableName, String attributeName, int value) throws SQLException {
    ArrayList list = null;
    Statement statement = conn.createStatement();
    ResultSet result = statement.executeQuery("SELECT admin_id FROM " + tableName + " WHERE " + attributeName + "='" + value + "'");
    while (result.next()) {
        list.add(result.getInt(1));
    }
    statement.close();
    int id[] = new int[list.size()];
    for (int i = 0; i < id.length; i++) {
        try {
            id[i] = ((Integer) list.get(i)).intValue();
        } catch(NullPointerException ne) {
        } catch(ClassCastException ch) {}
    }
    return id;
}
// enter code here

এই কোডটি দেখায় যে কেন ArrayListগুরুত্বপূর্ণ এবং কেন আমরা এটি ব্যবহার করি। কেবল কাস্টিং intথেকে Object। এটি সহায়ক হতে পারে।


দয়া করে আপনার উত্তরটি ব্যাখ্যা করুন
Gwenc37

1

উদাহরণস্বরূপ অবজেক্ট ভেরিয়েবল; hastaId

Object hastaId = session.getAttribute("hastaID");

উদাহরণস্বরূপ একটি অবজেক্টে কোনও বস্তুটি কাস্ট করুন,hastaID

int hastaID=Integer.parseInt(String.valueOf(hastaId));

0

এই কোডটি দেখুন:

public class sample 
{
  public static void main(String[] args) 
  {
    Object obj=new Object();
    int a=10,b=0;
    obj=a;
    b=(int)obj;

    System.out.println("Object="+obj+"\nB="+b);
  }
}

0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;

এটি এমন একটি পরিস্থিতি দেখায় যেখানে কাস্টিং প্রয়োজন হয় এবং আমি ত্রুটিটিও যুক্ত করব যা আসলে এই পরিস্থিতির সাথে দেখাবে shows কোনও নতুন কোডারের পক্ষে উদাহরণ নেই যদি প্রকৃত বাস্তবায়নটি নির্ণয় করা শক্ত। আমি আশা করি এই উদাহরণটি তাদের সহায়তা করে
নেহাল পওয়ার

0

অবশেষে, আপনার স্পেসিফিকেশনের জন্য সর্বোত্তম বাস্তবায়ন পাওয়া গেল।

public int tellMyNumber(Object any) {
    return 42;
}

-4

উদাহরণস্বরূপ কীওয়ার্ড সহ প্রথম পরীক্ষা করুন। যদি সত্য হয় তবে এটি নিক্ষেপ করুন


আমি এটি ব্যবহার করেছি এবং এখন আমি ভাবছি যে কীভাবে 'লাইনযুক্ত মানটি আনবক্সড করা না হয় তবে ইমিডিটালেই পুনরায় বাক্সযুক্ত করা হবে' line লাইনে solve (স্পটব্যাগ চেকগুলির কারণে) তাই এখন আমি কীভাবে এটি আরও ভাল সমাধান করবেন তা ভাবছি।
জ্যাস্পার ল্যানখোরস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.