2015-07-06 14 views
5

cung cấp một giao diện chung:Java Generics, giao diện và loại hạn chế

public interface I<E> { 
    public int interfaceMethod(E s); 
} 

và một lớp chung mà thực hiện giao diện

public class A<T> implements I<T> { 

    private T val; 

    public A(T x) { 
     val = x; 
    } 

    public int interfaceMethod(T val) { 
     // looks like T should be of the same type as instance variable 'val' 
     return 0; 
    } 

} 

tại sao các công việc sau đây?

public class Run { 

    public static void main(String[] args) { 

     A a = new A<String>("hello"); 

     System.out.println(a.interfaceMethod(100)); \\ returns 0 
    } 
} 

tôi mong đợi các tham số T loại phương pháp interfaceMethod theo quy định tại class A để hạn chế các phương pháp để lập luận rằng có các loại tương tự như cung cấp cho các nhà xây dựng của A. (trong trường hợp này là String).

Tại sao a.interfaceMethod không yêu cầu đối số loại String?

+0

có lẽ vì tôi không làm như sau 'A a = new A (" hello ");' ... – beoliver

+0

Tôi sẽ mạo hiểm rằng số nguyên được ngầm đúc đến chuỗi http://stackoverflow.com/ câu hỏi/9159358/implicit-cast-to-string-tostring-and-int – JoSSte

+0

http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use- nó –

Trả lời

1

Trong khi các câu trả lời khác giải thích rằng cảnh báo trình biên dịch thường sẽ hiển thị. Lời giải thích mà tôi đang tìm kiếm ở dạng link to a previous post do @JB Nizet cung cấp.

T t = new T<S>()

là không giống như

T<S> t = new T<S>()

Đầu tiên là một ví dụ về một liệu loại. Tôi quan tâm đến lý do tại sao hoạt động này (tức là ... nếu nó biên dịch và không ném lỗi thời gian chạy) thì phải có một thứ gì đó với nó.

Câu trả lời của bài đăng đó được trình bày chi tiết và giải thích chính xác lý do tại sao biên dịch này (ngắn truyện ngắn, tương thích ngược). Bài đăng đi vào chi tiết đầy đủ và giải thích các tác động đối với hệ thống kiểu Java.

1

Điều đó xảy ra bởi vì bạn bỏ qua các cảnh báo "sử dụng liệu của tham số một" (hoặc một cái gì đó như thế)

Sử dụng:

A<String> a = new A<String>("hello"); 

Khi phớt lờ những cảnh báo liên quan generic mã có thể biên dịch khi không nên .

+0

Không có cảnh báo ... Hoặc là những cảnh báo java-docs này? – beoliver

+0

Nếu bạn sử dụng intellij/eclipse, bạn sẽ thấy các cảnh báo trừ khi chúng bị vô hiệu hóa. – BobTheBuilder

+0

Nó chắc chắn đưa ra cảnh báo: * Run.java sử dụng các hoạt động không được kiểm tra hoặc không an toàn. * –

1

này hoạt động vì a dụ được gõ để A lớp chỉ
Bạn nên gõ nó như thế này:

A<String> a = new A<String>("hello"); 

dù cô không chỉ định tham số, bạn sẽ có thể đặt ở đó tất cả các loại dữ liệu như String , int v.v.

+0

Bạn đã đúng, @JBNizet, đã xóa – maskacovnik

+0

Xin lỗi, đã xem và được cải thiện ngay bây giờ @JBNizet – maskacovnik

Các vấn đề liên quan