2016-07-22 19 views
7

Tôi muốn lưu trữ một loại được gọi là App bên trong một tập hợp. App cần phải là một enum thực hiện giao diện App.Giả mạo người triển khai giao diện là một enum

Set<App> myApps; 

tôi đã xác định giao diện tương tự như vậy ...

interface App<T extends Enum<T>> {} 

này hầu như làm việc, ví dụ, bạn không thể làm được điều này ...

class MyClass implements Application<MyClass> {} 

Tuy nhiên, bạn có thể làm điều này ...

enum MyEnum implements Application<MyEnum> {} 
class Myclass implements Application<MyEnum> {} 

Điều gì là sai. Tôi chỉ muốn enums để có thể thực hiện giao diện này, làm thế nào tôi có thể thực thi điều này?

+0

Và chính xác thông báo lỗi nào bạn nhận được từ trình biên dịch? Vui lòng chỉnh sửa bài đăng của bạn để hiển thị cho chúng tôi, nhất quán, * tất cả * của các tuyên bố của bạn. –

+1

@MikeRobinson anh ta không nhận được một thông báo lỗi, đó là vấn đề - anh ta muốn trình biên dịch phàn nàn về tuyên bố cuối cùng. ;) – Thomas

+0

@MikeRobinson đọc lại câu hỏi. Không có lỗi từ trình biên dịch. OP chỉ muốn hạn chế người triển khai. – Mena

Trả lời

11

Xác định một phương pháp cho phép bạn thêm các yếu tố vào các thiết lập, nhưng sử dụng một hạn chế cho tham số đó ...

public <E extends Enum<E> & IMyInterface> void addToSet(final E value) { } 

tại sau đó

addToSet(MyEnum.K) will compile 

nhưng

addToSet(new Myclass()) will NOT compile 
+2

Giải pháp tốt. – Mena

+1

Vì vậy, nó khá nhiều cùng một loại công cụ tham số ngoại trừ như một phần của một tuyên bố phương pháp chứ không phải là một tuyên bố giao diện - gọn gàng :) – Ogen

+0

Loại tập của tôi sẽ là gì? – Ogen

1

AFAIK không thể thực thi một người triển khai giao diện để có các thuộc tính nhất định như là một enum.

Tuy nhiên, tùy thuộc vào mã của bạn và cách bạn sử dụng giao diện mà bạn có thể làm cho nó khó khăn cho một người nào đó không để làm cho implementor một enum:

  • Yêu cầu T để thực hiện App<T> cũng như để ngăn chặn thông qua bất kỳ enum để khai báo lớp (tức là App<T extends Enum<T> & App<T>>)
  • Sử dụng ranh giới bổ sung khi có thể (xem câu trả lời ΦXocę 웃 Пepeúpa của)
  • Thêm phương pháp đã được thực hiện bởi Enum như name(), ordinal() , getDeclaringClass() v.v.
  • Hãy để App<T ...> mở rộng Comparable<T>.
  • Khi có thể gọi getClass().isEnum() để kiểm tra thuộc tính đó khi đang chạy. Đây không phải là lý tưởng nhưng có những giải pháp tương tự thường được sử dụng như Collections.unmodifiableSet().
Các vấn đề liên quan