หมายเลขตัวแปร Java หรืออาร์กิวเมนต์สำหรับเมธอด


147

เป็นไปได้ไหมที่จะประกาศเมธอดที่อนุญาตพารามิเตอร์จำนวนตัวแปร?

สัญลักษณ์ที่ใช้ในคำจำกัดความที่ระบุว่าวิธีการควรอนุญาตให้มีจำนวนตัวแปรของพารามิเตอร์คืออะไร?

คำตอบ: varargs


11
ตั้งแต่การบ้านเราไม่ต้องการรู้คำถามของคุณเราแค่อยากรู้ว่าคุณกำลังเรียนรู้
HDave

คำตอบ:


275

ถูกต้อง. คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ในคู่มือ Oracle เกี่ยวกับค่าต่าง

นี่คือตัวอย่าง:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

ซึ่งสามารถเรียกว่าเป็น

foo("foo"); // Single arg.
foo("foo", "bar"); // Multiple args.
foo("foo", "bar", "lol"); // Don't matter how many!
foo(new String[] { "foo", "bar" }); // Arrays are also accepted.
foo(); // And even no args.

1
เป็นไปได้ไหมที่จะทำสิ่งประดิษฐ์ประเภทต่าง ๆ ? เช่น (String ... strs, int ... ints) อาร์กิวเมนต์ประเภทใดก็ได้ในลำดับใด ๆ
trusktr

5
@trusktr: ถ้าคุณต้องการที่วัตถุใด ๆ Object...เพียงแค่ใช้
BalusC

2
@trusktr ไม่สารพื้นฐานไม่ใช่วัตถุ มีคำอธิบายที่ดีเกี่ยวกับความแตกต่างได้ที่นี่: programmerinterview.com/index.php/java-questions/ …
Dick Lucas

5
@ Richard: การใช้Object... argsจะทำงานร่วมกับวิทยาการเพราะautoboxing
Sumit

1
@StevenVascellaro: ฉันคิดว่าข้อโต้แย้งได้รับการจัดการเหมือนอาร์เรย์ดังนั้นคุณอาจจะทำได้ง่ายๆvarargs.length
LMD

15
Variable number of arguments

มันเป็นไปได้ที่จะผ่านจำนวนตัวแปรของการขัดแย้งไปยังวิธีการ อย่างไรก็ตามมีข้อ จำกัด บางประการ:

  • จำนวนตัวแปรทั้งหมดต้องเป็นประเภทเดียวกัน
  • พวกเขาจะถือว่าเป็นอาร์เรย์ภายในวิธีการ
  • พวกเขาจะต้องเป็นพารามิเตอร์สุดท้ายของวิธีการ

เพื่อให้เข้าใจถึงข้อ จำกัด เหล่านี้ให้พิจารณาวิธีการในโค้ดต่อไปนี้ที่ใช้เพื่อส่งคืนจำนวนเต็มที่มากที่สุดในรายการจำนวนเต็ม:

private static int largest(int... numbers) {
     int currentLargest = numbers[0];
     for (int number : numbers) {
        if (number > currentLargest) {
            currentLargest = number;
        }
     }
     return currentLargest;
}

แหล่งที่มาของ Oracle Certified Associate Java SE 7 คู่มือการศึกษาโปรแกรมเมอร์ 2012



10

สำหรับประเภทอาร์กิวเมนต์ที่แตกต่างกันมี3 จุด :

public void foo(Object... x) {
    String myVar1  = x.length > 0 ? (String)x[0]  : "Hello";
    int myVar2     = x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
} 

จากนั้นเรียกมันว่า

foo("Hii"); 
foo("Hii", 146); 

เพื่อความปลอดภัยใช้แบบนี้:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

ข้อเสียเปรียบหลักของวิธีนี้คือหากพารามิเตอร์ทางเลือกต่างประเภทกันคุณจะสูญเสียการตรวจสอบประเภทคงที่ โปรดดูรูปแบบเพิ่มเติม



0

ใช่ Java อนุญาตvargsในพารามิเตอร์ method

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.