2013-06-29 31 views
5

Hãy nói rằng tôi có một giao diện 'của Inter, và Inter có một phương phápLàm cách nào để chỉ định kiểu trả về của một phương thức loại đối tượng mà phương thức được gọi?

Inter someMethod(); 

Làm thế nào tôi có thể xác định rằng các loại của đối tượng trở lại phải được giống như các đối tượng trên đó phương pháp này được gọi là? Vì vậy, nếu tôi có hai lớp 'C1' và 'C2' thực hiện Inter, nếu một thể hiện của C1 gọi someMethod (c1.someMethod()) kết quả sẽ là một thể hiện của C1, trong khi nếu một thể hiện của C2 gọi someMethod kết quả sẽ là một ví dụ C2.

Làm thế nào về thông số? Nếu Inter có phương thức thứ hai

void someMethod2(Inter inter) 

Làm cách nào để xác định tham số phải là một thể hiện của cùng một lớp với đối tượng gọi phương thức?

Trả lời

10

Sử dụng Generics.

public interface Inter<T> { 

    T someMethod(); 
    void someMethod2(T obj); 

} 

public class C1 implements Inter<C1> { 

    public C1 someMethod() { 
     // .. 
    } 

    public void someMethod2(C1 obj) { 
     // .. 
    } 

} 

public class C2 implements Inter<C2> { 

    public C2 someMethod() { 
     // .. 
    } 

    public void someMethod2(C2 obj) { 
     // .. 
    } 

} 

Reference:
Generic Types (The Java™ Tutorials > Generics)

Sửa: (Sử dụng một kiểu generic bị chặn; để đáp ứng với ý kiến ​​OP của)

public interface Inter<T extends Inter<T>> { 

    T someMethod(); 
    void someMethod2(T obj); 
} 

public class C1 implements Inter<C1> { 

    public C1 someMethod() { 
     return new C1(); 
    } 

    public void someMethod2(C1 obj) { 
     // .. 
    } 
} 

public class C2 implements Inter<C3> { // ERROR 
    .. 
} 

Nhưng, ở đây đồng mes bắt.

public class C2 implements Inter<C1> { // COMPILES! 
    .. 
} 

Vì, C1 cũng thỏa mãn T extends Inter<T>. Điều này là xa như điều này có thể đi tôi tin.

Reference:
Bounded Type Parameters (The Java™ Tutorials > Generics)

+0

Điều này thực hiện thủ thuật. Một điều mặc dù: "lớp công khai C1 triển khai Inter " Tôi có thể buộc ở đây rằng "C1" không thể triển khai một Inter khác với Inter ? – user2460978

+0

Đó là do thiết kế. Bạn sẽ nhận được một lỗi trình biên dịch nếu bạn thử: C1 cài đặt Inter , Inter Nhưng, nếu bạn muốn ngăn chặn: C1 triển khai Inter Tôi không nghĩ là có thể. –

+0

Tôi có nghĩa là bạn sẽ nhận được một lỗi biên dịch nếu bạn đã thử "C1 thực hiện Inter ", hoặc, nói chung, "X thực hiện Inter ".Bởi vì, với cách tiếp cận này, bản thân giao diện không buộc rằng kiểu trả về của someMethod() phải giống như kiểu của đối tượng gọi phương thức. – user2460978

2

Bạn có thể thử một cái gì đó giống như

public interface Inter<T> { 

    public T doSomething(); 
} 

public class C1 implements Inter<C1> { 

    @Override 
    public C1 doSomething() { 
     return new C1(); 
    } 
} 

public class C2 implements Inter<C2> { 

    @Override 
    public C2 doSomething() { 
     return new C2(); 
    } 
} 
0

này Làm thế nào tôi có thể xác định rằng các loại của đối tượng trở lại đã được các giống như đối tượng mà phương thức được gọi là gì?

Bạn không thể làm điều này trong Java.

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