जावा में ऑपरेटर ओवरलोडिंग


181

कृपया मुझे बताएं कि क्या जावा में ऑपरेटरों को अधिभार देना संभव है? यदि यह जावा में कहीं भी उपयोग किया जाता है तो क्या आप मुझे इसके बारे में बता सकते हैं।


जवाबों:


235

नहीं, जावा उपयोगकर्ता द्वारा परिभाषित ऑपरेटर को ओवरलोडिंग का समर्थन नहीं करता है। जावा का एकमात्र पहलू जो "कस्टम" ऑपरेटर ओवरलोडिंग के करीब आता है, स्ट्रिंग्स के लिए + का संचालन होता है, जिसके परिणामस्वरूप या तो स्थिरांक का समय-समय पर समापन होता है या StringBuilder / StadBuffer का उपयोग करके निष्पादन-समय का निष्कर्ष होता है। आप अपने स्वयं के ऑपरेटरों को परिभाषित नहीं कर सकते हैं जो हालांकि उसी तरह से कार्य करते हैं।

जावा जैसी (और JVM- आधारित) भाषा के लिए जो ओवरलोडिंग के लिए ऑपरेटर का समर्थन करती है , आप कोटलिन या ग्रूवी को देख सकते हैं । वैकल्पिक रूप से, आपको जावा कंपाइलर प्लगइन समाधान के साथ भाग्य मिल सकता है ।


4
आप कह रहे हैं कि हम जावा में रैपर नहीं बना सकते? जैसे कि इनगर्ल जैसे स्मॉलइंटर?
हुसैन तुगरुल बायुकिसिक

3
@ tuğrulbüyükışık: पहले से ही सभी मौजूदा आदिम प्रकारों के लिए रैपर हैं - लेकिन अगर आप अपना नया रैपर टाइप बनाना चाहते हैं, तो आप इसे अन्य लोगों की तरह व्यवहार नहीं कर पाएंगे, जैसा कि भाषा में विशिष्ट समर्थन है।
जॉन स्कीट

1
धन्यवाद, मैं इसके बारे में googled और नहीं मिल सका। मैं जानना चाहता था कि क्या मैं दो प्राइमेटीज़ (एक डबल और एक इंट ---> अच्छी परिशुद्धता + अच्छी रेंज) से बना एक जटिल वैरिएबल बना सकता
हूं

40
@djaqeel: ऑपरेटर ओवरलोडिंग बुरी तरह से उपयोग किए जाने पर कोड को कम पठनीय बनाता है । जब अच्छी तरह से उपयोग किया जाता है, तो यह पठनीयता आईएमओ को बहुत बढ़ा सकता है। उस कोड को देखें जो BigIntegerजावा में उपयोग करता है, तो समान BigInteger# कोड # ऑपरेटरों का उपयोग करके देखें। मैं नहीं देखता कि प्रतिनिधि ओओपी सिद्धांतों को कैसे तोड़ते हैं - आपको अपनी आपत्तियों की तुलना में बहुत अधिक सटीक होने की आवश्यकता है। मुझे पता नहीं है कि जावा डिजाइनरों ने विभिन्न विशेषताओं को क्यों शामिल नहीं किया, लेकिन मुझे संदेह है कि संसाधन दबाव और भाषा को छोटा और अपेक्षाकृत सरल रखने की इच्छा है।
जॉन स्कीट

4
मुझे पता है कि यह देर हो चुकी है, लेकिन एक उदाहरण एक हजार तर्कों के लायक है। यह देखते हुए m0एक के रूप में Matrixऔर v0, v1, v2, v3, और v4के रूप में Vectorहै, बस की तुलना में कितना समय आप पर ले जाता है सही ढंग से निम्नलिखित गणितीय अभिव्यक्ति की व्याख्या m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);। ऑपरेटर को ओवरलोडिंग के लिए समर्थन शामिल किया गया था, इसे लिखा जा सकता था m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
code_dredd

38

स्ट्रिंग में टाइप करने की क्रिया के लिए जावा में ऑपरेटर ओवरलोडिंग का उपयोग किया जाता है:

String concat = "one" + "two";

हालाँकि, आप अपने स्वयं के ऑपरेटर अधिभार को परिभाषित नहीं कर सकते


26

+स्ट्रिंग्स के लिए अतिभारित होने वाले सभी लोगों के अलावा , -फ्लोटिंग पॉइंट और पूर्णांक संचालन दोनों के लिए भी अतिभारित किया जाता है, जैसा कि हैं *और /

[संपादित करें] %फ्लोटिंग पॉइंट के लिए भी अतिभारित है, जो C या C ++ पृष्ठभूमि वाले लोगों के लिए थोड़ा आश्चर्यचकित करने वाला हो सकता है।


21

जावा ऑपरेटर को ओवरलोडिंग की अनुमति नहीं देता है। पसंदीदा तरीका यह है कि आप कार्रवाई करने के लिए अपनी कक्षा में एक विधि को परिभाषित करें: a.add(b)इसके बजाय a + b। आप अन्य बिट्स का एक सारांश देख सकते हैं, जो जावा सी से बाहर की भाषाओं की तरह है: सी और सी ++ से हटाई गई विशेषताएँ


2
महत्वपूर्ण बात यह है कि जावा स्रोत फ़ाइलों को संदर्भ स्वतंत्र बनाने का डिज़ाइन लक्ष्य है। बहुत बड़े (MLOC) को पढ़ने की कोशिश करते हुए, मैक्रो हैवी C प्रोग्राम्स में बहुत लंबे समय तक सीखने की अवस्था होती है। एक तुलनीय (या बड़ा) जावा प्रोग्राम छोटे जावा प्रोग्राम की तुलना में अधिक कठिन नहीं है। जैसा कि गोसलिंग ने कहा: ब्लू कॉलर प्रोग्रामर के लिए एक भाषा जिसमें काम करना है। [और जो कोई भी
बायलरप्लेट

2
Oracle के लिए धन्यवाद, java.sun.com लिंक काम नहीं करता है। यदि संभव हो तो क्या आप अद्यतन लिंक दे सकते हैं?
सैयद अकील आशिक

17

आप इसे स्वयं नहीं कर सकते क्योंकि जावा ऑपरेटर ओवरलोडिंग की अनुमति नहीं देता है।

एक अपवाद के साथ , हालांकि। + और + = स्ट्रिंग वस्तुओं के लिए अतिभारित हैं।


8
जावा में ऑपरेटर ओवरलोडिंग के कई अन्य उदाहरण हैं। उदाहरण के लिए &, |और ^के लिए ओवरलोड कर रहे हैं booleanऔर अभिन्न प्रकार के। और वास्तव में, अंकगणितीय और संबंधपरक ऑपरेटर विभिन्न संख्यात्मक प्रकारों के लिए अतिभारित होते हैं। (बेशक, ओवरलोड्स के शब्दार्थ बहुत करीब हैं ...)
स्टीफन सी

16

जैसा कि कई अन्य लोगों ने उत्तर दिया है: जावा उपयोगकर्ता परिभाषित ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है।

शायद यह ऑफ-टॉपिक है, लेकिन मैं कुछ चीजों पर टिप्पणी करना चाहता हूं जो मैंने कुछ उत्तरों में पढ़ी हैं।

पठनीयता के बारे में।
की तुलना करें:

  1. सी = ए + बी
  2. c = a.add (b)

दुबारा देखो!
कौन सा अधिक पठनीय है?

एक प्रोग्रामिंग भाषा जो उपयोगकर्ता-परिभाषित प्रकारों के निर्माण की अनुमति देती है, उन्हें उसी तरह से कार्य करने की अनुमति देनी चाहिए जैसे अंतर्निहित प्रकार (या आदिम प्रकार)।

इसलिए जावा जेनेरिक प्रोग्रामिंग के एक मूल सिद्धांत को तोड़ता है:
हमें उपयोगकर्ता-परिभाषित प्रकारों की वस्तुओं के साथ अंतर्निहित प्रकारों की वस्तुओं को बदलने में सक्षम होना चाहिए।
(आप सोच रहे होंगे: "क्या उसने 'निर्मित की वस्तुएँ' कहा था?" हाँ, यहाँ देखें ।)

स्ट्रिंग संघनन के बारे में:

गणितज्ञ सेट पर कम्यूटेटिव ऑपरेशन के लिए प्रतीक + का उपयोग करते हैं।
तो हम यह सुनिश्चित कर सकते हैं कि ए + बी = बी + ए।
स्ट्रिंग का संघनन (अधिकांश प्रोग्रामिंग भाषाओं में) इस सामान्य गणितीय संकेतन का सम्मान नहीं करता है।

a := "hello";
b := "world";
c := (a + b = b + a);

या जावा में:

String a = "hello";
String b = "world";
boolean c = (a + b).equals(b + a);

अतिरिक्त:
ध्यान दें कि जावा समानता और पहचान कैसे भ्रमित होती है। == (समानता) प्रतीक का अर्थ है:
ए। आदिम प्रकारों के लिए समानता।
ख। उपयोगकर्ता-परिभाषित प्रकारों के लिए पहचान-जांच, इसलिए, हम समानता के लिए फ़ंक्शन बराबर () का उपयोग करने के लिए मजबूर हैं ।
लेकिन ... ऑपरेटर ओवरलोडिंग के साथ इसका क्या करना है?
यदि भाषा ऑपरेटर को ओवरलोडिंग की अनुमति देती है, तो उपयोगकर्ता समानता ऑपरेटर को उचित अर्थ दे सकता है।


प्रतीक ==का उपयोग जावा में समानता के लिए किया जाता है, जैसे कि C और C ++ में। इससे ऑपरेटर के ओवरलोडिंग से कोई लेना-देना नहीं है।
हॉट लिक्स

2
जावा में ऑपरेटर ==, का मतलब केवल आदिम प्रकारों के लिए समानता है। उपयोगकर्ता-परिभाषित प्रकारों के लिए पहचान का मतलब है। C ++ में शब्दार्थ उपयोगकर्ता द्वारा परिभाषित किया गया है, लेकिन अंतर्निहित शब्दार्थ, समानता को प्रस्तुत करना चाहिए। स्ट्रिंग a = "हैलो"; स्ट्रिंग बी = "हैलो"; बूलियन सी = (ए = बी);
फर्नांडो पेलिसियोनी

3
इसलिए आपने अपनी पहली टिप्पणी में जो कहा है वह गलत है। सही? कृपया, मुझे बताएं कि सी में उपयोगकर्ता-परिभाषित प्रकारों पर समानता और पहचान का परीक्षण कैसे करें। आप सही हैं, समानता के बारे में मेरी टिप्पणी ओटी है, लेकिन मैंने स्पष्ट किया कि ("एक्स्ट्रा" देखें)। तथ्य यह है कि मैंने एक प्रोग्रामिंग भाषा नहीं बनाई है इसका मतलब यह नहीं है कि मैं किसी मौजूदा की आलोचना नहीं कर सकता। मुझे खेद है अगर आपने आलोचना को धार्मिक युद्ध के रूप में देखा है।
फर्नांडो पेलिसियोनी

1
लंबी चीज़ों को छोटा रखना: जावा चूसना।
Kolya इवानकोव


6

बस अपने Java कोड के साथ Xtend का उपयोग करें। यह ऑपरेटर ओवरलोडिंग का समर्थन करता है:

    package com.example;

@SuppressWarnings("all")
public class Test {
  protected int wrapped;

  public Test(final int value) {
    this.wrapped = value;
  }

  public int operator_plus(final Test e2) {
    return (this.wrapped + e2.wrapped);
  }
}

package com.example

class Test2 {

    new() {
        val t1 = new Test(3)
        val t2 = new Test(5)
        val t3 = t1 + t2
    }

}

आधिकारिक वेबसाइट पर, प्रत्येक ऑपरेटर के लिए लागू करने के तरीकों की एक सूची है!


5

या, आप जावा ग्रूवी बना सकते हैं और जो आप चाहते हैं उसे प्राप्त करने के लिए इन कार्यों को ओवरलोड कर सकते हैं

//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...

class Fish {
    def leftShift(Fish fish) {
        print "You just << (left shifted) some fish "
    }
}


def fish = new Fish()
def fish2 = new Fish()

fish << fish2

कौन ग्रूवी होना / उपयोग नहीं करना चाहता है? : डी

नहीं, आप जावा में उसी तरह संकलित सरोवर जार का उपयोग नहीं कर सकते। यह अभी भी जावा के लिए एक संकलक त्रुटि है।


1

C ++ के विपरीत, जावा उपयोगकर्ता परिभाषित ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है। ओवरलोडिंग आंतरिक रूप से जावा में की जाती है।

हम +उदाहरण के लिए (प्लस) ले सकते हैं :

int a = 2 + 4;
string = "hello" + "world";

यहां, प्लस दो पूर्णांक संख्याओं को जोड़ता है और दो तारों को मिलाता है। इसलिए हम कह सकते हैं कि जावा आंतरिक ऑपरेटर को ओवरलोडिंग का समर्थन करता है लेकिन उपयोगकर्ता परिभाषित नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.