2012-02-16 16 views
5

निम्नलिखित पायथन कतरना करता है मैं वास्तव में क्या मतलब है:मैं जावा में तर्क कैसे बढ़ा सकता हूं?

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

def function(a, b, c): 
    print("%i :: %s :: %f" % (a,b,c)) 

a = 1 
b = "abc" 
c = 1.0 

function(a, b, c) 

list = [a, b, c] 

# This is what I am searching for in Java 
function(*(list)) 

तो मैं एक सूची की तरह संरचना है और मैं नहीं जानता कि यह कितने तर्क है, लेकिन मैं जानता हूँ कि यह बहस की सही संख्या है कि सही प्रकार और प्रारूप के साथ। और मैं उन्हें एक विधि में पास करना चाहता हूं। इसलिए मुझे उन तर्कों का विस्तार करना होगा। क्या कोई जावा में ऐसा करने के बारे में जानता है?

+0

क्या आप शायद [के लिए] देख रहे हैं (http://stackoverflow.com/questions/766559/when-do-you-use-varargs-in-java) [varargs] (http://docs.oracle.com /javase/1.5.0/docs/guide/language/varargs.html)? –

+0

परिभाषित करें "विस्तार करें"? यह आपके उदाहरण से स्पष्ट नहीं है इसका क्या अर्थ है। – Tudor

+0

यदि आप केवल '%' ऑपरेटर की तरह कुछ उपयोग करना चाहते हैं, तो आप नीचे दिए गए मेरे उत्तर में 'फॉर्मेटर' क्लास का उपयोग कर सकते हैं। –

उत्तर

5

जावा में यह सुविधा नहीं है, क्योंकि एक स्थिर, दृढ़ता से टाइप की गई भाषा के रूप में यह एक समान प्रकार के मानों का संग्रह करने के लिए असामान्य है जिसे सभी समग्र वस्तु (सरणी, सूची इत्यादि) में संग्रहीत किया जा सकता है। ।)। पायथन में यह समस्या नहीं है क्योंकि सब कुछ गतिशील रूप से टाइप किया गया है। आप इसे एक सहायक विधि को परिभाषित करके जावा में कर सकते हैं जो सभी पैरामीटर को पकड़ने में एक ऑब्जेक्ट लेता है, फिर वास्तविक विधि में कॉल में उन्हें बाहर निकाल देता है।

आशा है कि इससे मदद मिलती है!

1

आप नहीं कर सकते। जावा में, संकलन समय पर विधि पैरामीटर की जांच की जाती है, और चूंकि सरणी की सामग्री केवल रनटाइम पर परिभाषित की जाती है, यह जांच असंभव होगी।

आपका सबसे नज़दीकी समाधान पैरामीटर के रूप में एक सरणी लेने का तरीका है, और आखिरकार लक्षित विधि पर कॉल करने के लिए तर्कों का विस्तार करना है।

2

आप वैकल्पिक पैरामीटर की घोषणा कर सकता है Object... इस तरह के साथ कि आप युक्तियों के स्वेच्छाचारी संख्या पारित कर सकते हैं और फिर आवश्यक प्रकार उनमें से प्रत्येक डाली:

method2("abc", 1); 
:

public void method1(String p1, Integer p2) { 
} 

public void method2(Object... params) { 
    method1((String)params[0], (Integer)params[1]; 
} 

आप के रूप method2 कॉल कर सकते हैं

बेशक, यह उदाहरण थोड़ा अनावश्यक है, क्योंकि आप सीधे method1 पर कॉल कर सकते हैं, लेकिन यह वह नहीं है जिसे मैं स्पष्ट करना चाहता हूं। :)

0

आप ऐसा कर सकते हैं:

import java.util.Formatter; 

// ... 

StringBuilder target = new StringBuilder(); 
Formatter formatter = new Formatter(target); 

List<Integer> integers = new ArrayList<Integer>(); 
integers.add(1); 
integers.add(2); 
integers.add(3); 

formatter.format("%d %d %d", integers.toArray()); 
System.out.println(target.toString()); 

संपादित करें:Javadoc for java.util.Formatter

0

मैं इस एक ऐसी ही वाक्य रचना के साथ अपने प्रारंभिक कोड के रूप में एक ही बात करता है लगता है ...

public class MultiArgs { 

    public static void main(String[] args) { 
     int a = 1; 
     String b = "abc"; 
     double c = 1.0; 
     List<?> list = Arrays.asList(a, b, c); 

     System.out.println(function(a, b, c)); // 1 :: abc :: 1.000000 
     System.out.println(function(list.toArray())); // 1 :: abc :: 1.000000 
    } 

    private static <T extends Object> String function(T... objects) { 
     return String.format("%d :: %s :: %f", objects); 
    } 
} 
0

यह अनुशंसित नहीं है (templatetypedef के उत्तर नोट्स के रूप में, यह दृढ़ता से टाइप की गई भाषा के लिए एक बहुत ही असामान्य पैटर्न है), लेकिन आप क्यू एलडी जो आप प्रतिबिंब का उपयोग करना चाहते हैं।

SomeType foo = //obtained from elsewhere 
List<?> args = //obtained from somewhere else 

//this bit obtains the method handle 
Method theMethod = null; 
for (Method m : foo.getClass().getMethods()) { 
    if (m.getName().equals("theMethodIWant") { 
     theMethod = m; 
     break; 
    } 
} 

theMethod.invoke(foo, args.toArray()); //this is the line that does the magic 

कुछ काफी गंभीर चेतावनियां: - अजगर की तरह एक गतिशील भाषा में की तुलना में अधिक तो

  • प्रतिबिंब एक सीधा कॉल की तुलना में एक महत्वपूर्ण प्रदर्शन प्रभाव हो सकता है। इससे कोई फर्क नहीं पड़ता या इससे कोई फर्क नहीं पड़ता। संदेह में, उपाय करें।

  • ब्लॉक प्राप्त है कि एक विधि संभाल एक अशक्त सूचक में परिणाम होगा अगर इस नाम के साथ एक विधि नहीं मिला है

  • तर्कों की सूची तर्कों की बिल्कुल सही संख्या होनी चाहिए, सही प्रकार के साथ । आप इसे कहीं और सत्यापित करने के लिए ज़िम्मेदार हैं। यह एक गतिशील भाषा में कठिन होगा, क्योंकि रनटाइम आपके लिए बहुत कम (यदि कोई हो) प्रकार का दबाव करेगा।

  • method.invoke() कई अपवादों को फेंक सकता है (IllegalAccessException, IllegalArgumentException, InvocationTargetException, आदि) कि यह उदाहरण अनदेखा करता है। आपको उन त्रुटियों को उचित रूप से पकड़ना होगा और उन त्रुटियों से निपटना होगा

  • यदि विधि कहा जा रहा है तो सार्वजनिक नहीं है, तो आपको इसे कॉल करने के लिए इससे भी अधिक काम करना होगा।

  • यह उदाहरण उस मामले से निपटने का भी प्रयास नहीं करता है जहां आपके पास ओवरलोडेड विधि है। विभिन्न तर्क सूचियों के साथ "theMethodIwant" नामक दो विधियों को विधि संभाल प्राप्त करने के लिए एक अलग दृष्टिकोण की आवश्यकता होगी।

सब कुछ, यदि संभव हो तो मैं प्रतिबिंब का उपयोग न करने की सलाह दूंगा।

संबंधित मुद्दे