2011-01-07 28 views
5

Tôi đã dành khá nhiều thời gian với Google để tìm một số thông tin về chủ đề này, nhưng kết quả liên quan đến cả hai loại Java enums và covariant return khá nhiều không tồn tại.Các kiểu trả về Java covariant không hoạt động đối với các phương thức ghi đè của một cá thể enum?

Vì vậy: là nó có thể sử dụng các loại trở lại hiệp biến với các phương pháp enum nơi bạn định nghĩa một phương thức trong lớp enum và sau đó ghi đè lên nó trong các trường hợp như vậy:

package enumcovariance.test; 

public enum CovariantEnum { 

    INT_INSTANCE(new Integer(3)) { 
     @Override 
     public Integer getData() { 
      return (Integer) super.getData(); 
     } 
    }, 

    STR_INSTANCE("Hello world") { 
     @Override 
     public String getData() { 
      return (String) super.getData(); 
     } 
    }; 

    private final Object data; 

    private CovariantEnum(Object data) { 
     this.data = data; 
    } 

    public Object getData() { 
     return data; 
    } 

} 

Và sau đó để tận dụng hiệp phương sai như vậy:

package enumcovariance.test; 

import org.junit.Test; 


public class CovariantEnumTest { 

    @Test 
    public void intEnumTest() { 
     Integer i = CovariantEnum.INT_INSTANCE.getData(); 
    } 

    @Test 
    public void strEnumTest() { 
     String s = CovariantEnum.STR_INSTANCE.getData(); 
    } 

} 

Trong trường hợp này trình biên dịch là tốt với định nghĩa enum của tôi, nhưng trường hợp thử nghiệm thất bại trong việc biên dịch, nói rằng đối tượng không thể được chuyển đổi sang Integer (hoặc Chuỗi). Rõ ràng trình biên dịch chỉ nhìn vào định nghĩa cơ sở của phương thức, chứ không phải phương pháp ghi đè. Với định nghĩa enum khác, tôi đã có phương pháp cơ sở trừu tượng, nhưng điều đó vẫn không hoạt động.

Tôi nghĩ rằng đó là điều phức tạp để làm với cách thức enums được chuyển đổi trong quá trình biên dịch để ngăn chặn nó hoạt động, nhưng tôi muốn chắc chắn nó không chỉ là tôi làm điều gì đó ngớ ngẩn.

Lưu ý rằng trường hợp thử nghiệm này được thừa nhận là rất có hiệu quả, trong thực tế enum của tôi chức năng này sẽ hữu ích hơn. Tôi có thể đăng nó nếu cần thiết.

Trả lời

2

Loại CovariantEnum.INT_INSTANCECovariantEnum trả về Object từ getData.

Thật không may, bạn cũng không thể thực hiện loại chung loại enum.

+0

Tôi hiểu, cảm ơn bạn đã trả lời. Tôi đã hy vọng loại sẽ là lớp con thực sự, nhưng tôi đoán nó chỉ là một hạn chế do cách enums được thực hiện trong Java. –

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