2013-05-04 35 views
8

Trong khi tôi đang làm một số chạy thử nghiệm một số mã trong thread này tôi phát hiện ra một điều kỳ lạ, Nếu bạn xem xét các chương trình sau đâyJava phương pháp quá tải - nhập nhằng

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)); 
    } 
} 

tôi đã mong trình biên dịch Java để hiển thị nhập nhằng lỗi do thuộc tính Erasure byte-code, nhưng không. Bây giờ khi tôi đã cố gắng để chạy mã này, tôi đã mong rằng test1(List) sẽ được gọi và sản lượng sẽ được "abc" nhưng trước sự ngạc nhiên của tôi nó gọi test1(List<Integer>) (đầu ra là 1)

Tôi thậm chí đã cố gắng như dưới đây

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

Nhưng vẫn tìm thấy Java gọi test1(List<Integer> param) phương pháp và khi tôi kiểm tra các param nó có String "a" (làm thế nào đã làm Java đúc List<String>-List<Integer>?)

+5

Mã bạn đã cung cấp không biên dịch hoàn toàn cho tôi - tôi gặp lỗi: 'error: name clash: test1 (Danh sách ) và test1 (Danh sách) có cùng xóa ' –

+0

Tương tự tại đây, trong java cấu trúc dữ liệu templated có liên quan vì vậy nó không nên biên dịch, tuy nhiên nếu bạn sử dụng c + + một cái gì đó tương tự như thế này có thể biên dịch như templated lớp học không chia sẻ bất cứ điều gì – aaronman

+0

Tôi có mã tuân thủ trong Eclipse Indigo, Java 1.6.0_30 – sanbhat

Trả lời