2012-03-09 28 views
6

EDIT: Tôi sẽ để đây ở đây làm ví dụ. Đọc các nhận xét để biết thêm thông tin nhưng thường: KHÔNG SỬ DỤNG THIẾT KẾ NÀY! Đó là BAD!Java - Ghi đè tham số kiểu đối tượng với loại bê tông

tôi đã tìm kiếm một câu trả lời cho một thời gian bây giờ, nhưng không thể tìm thấy bất cứ điều gì nói thật cụ thể, không có bạn có thể không phải vì ... hoặc có bạn có thể là cách bạn làm điều đó ..

Vì vậy, các câu hỏi là, tôi có thể tạo ra một phương pháp trừu tượng xác định các tham số kiểu Object và sau đó đã một cái gì đó thực hiện nó với một loại bê tông thông số như thế này:

public abstract class ToBeOverriden { 
    public Object method1 (Object parameter); 
    public String method2 (Object parameter); 
    public void method3 (Object parameter); 
} 

và sau đó ghi đè lên nó với điều này:

public class Implementation { 
    @Override 
    public DateTime method1 (Person parameter){ 
     return new DateTime(); 
    } 

    @Override 
    public String method2 (MotorCycle parameter){ 
     return new DateTime(); 
    } 

    @Override 
    public void method3 (String parameter){ 
     return new DateTime(); 
    } 
} 

Trường hợp người là một đối tượng được tạo ra bởi tôi. Loại trả lại có thể là bất cứ điều gì. Hiện tại tôi không thể làm điều này. Nó không cho tôi. Tôi đoán là vì lớp của tôi không mở rộng Object. Mặc dù mọi thứ mở rộng đối tượng ... Vì vậy, ...

Hoặc tôi có cần làm mới kiến ​​thức Java của mình không? :)

EDIT: Đã thêm cấu trúc lớp phức tạp hơn.

Cảm ơn!

Trả lời

15

Bạn sẽ cần phải sử dụng Java Generics:

public abstract class ToBeOverriden<E,V> { 
    public E method (V parameter); 
} 

public class Implementation extends ToBeOverriden<DateTime,Person> { 
    @Override 
    public DateTime method (Person parameter){ 
     return new DateTime(); 
    } 
} 

Added:

E tham số có thể được Bỏ qua phần, mã vẫn sẽ biên dịch. Tuy nhiên, nếu việc triển khai khác nhau của ToBeOverriden sẽ sử dụng các loại trả lại khác nhau, tôi nghĩ tốt hơn là giữ lại E. Nhưng đó là vấn đề về sở thích cá nhân - tôi không thích nhìn thấy Object ở bất kỳ đâu trong mã.

Added 2:

Như về bản cập nhật của bạn trong câu hỏi, bạn sẽ cần phải có một loại Generic riêng biệt cho mỗi phương pháp. Ví dụ:

public abstract class ToBeOverriden<A,B,C> { 
    public Object method1 (A parameter); 
    public String method2 (B parameter); 
    public void method3 (C parameter); 
} 

Tuy nhiên, thông thường, khi bạn cần cấu trúc khủng khiếp - thì mã của bạn được thiết kế sai. Trong 95% trường hợp 1 tham số kiểu chung là đủ. Trong 4,99% trường hợp 2 thông số kiểu chung là đủ.

+1

Không bắt buộc * E *, chỉ cần * V *. –

+0

@AmirPashazadeh Bạn nói đúng, không nghĩ vậy. Đã cập nhật câu trả lời của tôi. – bezmax

+0

Điều gì xảy ra nếu nó có nhiều loại trả về/kiểu tham số hơn? E sẽ là gì? – Hannibal

0

Bạn làm :) The spec nói:

Hai phương pháp có chữ ký tương tự nếu họ có cùng tên và lập luận loại.

Bạn có thể dễ dàng có public Object method (Object parameter);public Object method (Person parameter); trong lớp học của mình cạnh nhau và các phương thức này sẽ khác nhau.

Và có, tất cả các lớp cuối cùng mở rộng Object.

2

Bạn có thể làm như sau:

public abstract class ToBeOverriden<T> { 
    public Object method (T parameter); 
} 

public class Implementation extends ToBeOVerriden<Person>{ 
    @Override 
    public DateTime method (Person parameter){ 
     return new DateTime(); 
    } 
} 

Nhưng bạn không thể làm điều đó mà không generification, và vấn đề là đối số, không phải là kiểu trả về. Giả sử bạn có thể làm điều đó mà không cần generification, thì bạn có thể giữ một tham chiếu đến đối tượng thực hiện của bạn với một giao diện, và bạn có thể gọi phương thức với bất kỳ đối tượng nào làm đối số, không chỉ là một Person (chống lại kiểu an toàn của Java).

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