2013-05-04 4 views
8

जब मैं, मैं एक अजीब बात यह पता चला इस thread में कुछ कोड का परीक्षण करने के लिए आप निम्न कार्यक्रमजावा विधि अधिभार - अस्पष्टता

import java.util.ArrayList; 
import java.util.List; 

public class OverloadTest { 

    public String test1(List l){ 
     return "abc"; 
    } 

    public int test1(List<Integer> l){ 
     return 1; 
    } 

    public static void main(String [] args) { 
     List l = new ArrayList(); 
     System.out.println(new OverloadTest().test1(l)); 
    } 
} 

पर विचार अगर मैं जावा कम्पाइलर उम्मीद कर रहा था अस्पष्टता को दिखाने के लिए कुछ रन कर रहा था त्रुटि बाइट-कोड मिटा संपत्ति के कारण, लेकिन ऐसा नहीं हुआ। अब जब मैं इस कोड को चलाने की कोशिश की, मैं उम्मीद कर रहा था कि test1(List) बुलाया जाएगा और उत्पादन "abc" होगा, लेकिन मेरे आश्चर्य यह कहा जाता test1(List<Integer>) (उत्पादन 1 था)

मैं भी तरह की कोशिश की नीचे

List l = new ArrayList(); 
l.add("a"); 
System.out.println(new OverloadTest().test1(l)); 

लेकिन फिर भी पाया जावा test1(List<Integer> param) विधि बुला और जब मैं param निरीक्षण किया यह String "एक" था (कैसे जावा List<Integer> करने के लिए List<String> डाली थी?)

+5

आपके द्वारा प्रदान किया गया कोड मेरे लिए बिल्कुल संकलित नहीं है - मुझे त्रुटि मिलती है: 'त्रुटि: नाम टकराव: test1 (सूची ) और test1 (सूची) में एक ही मिरर है –

+0

यहां वही जावा टेम्पलेटेड डेटा संरचनाएं संबंधित हैं इसलिए इसे संकलित नहीं करना चाहिए, हालांकि यदि आप सी ++ का उपयोग करते हैं तो इस तरह के कुछ संकलित हो सकते हैं क्योंकि टेम्पलेटेड वर्ग कुछ भी साझा नहीं करते हैं – aaronman

+0

मेरे पास ग्रहण इंडिगो, जावा 1.6.0_30 – sanbhat

उत्तर

4

यह एक निश्चित बग है। https://bugs.eclipse.org/bugs/show_bug.cgi?id=354229

ऐसा लगता है कि यह बग ग्रहण 3.7 के लिए javac5, javac6 और ecj में मौजूद था, लेकिन यह ग्रहण 3.8 और बाद में तय किया गया था।

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