I would like to store a type called App
inside a set. App
needs to be an enum that implements the App
interface.
Set<App> myApps;
I have defined the interface like so...
interface App<T extends Enum<T>> {}
This is almost working, for example, you cannot do this...
class MyClass implements Application<MyClass> {}
However, you can do this...
enum MyEnum implements Application<MyEnum> {}
class Myclass implements Application<MyEnum> {}
Which is wrong. I only want enums to be able to implement this interface, how can I enforce this?
Yes, Enum implements an interface in Java, it can be useful when we need to implement some business logic that is tightly coupled with a discriminatory property of a given object or class.
In short, yes, this is okay. The interface does not contain any method bodies; instead, it contains what you refer to as "empty bodies" and more commonly known as method signatures. It does not matter that the enum is inside the interface.
After a bit of experimentation, my conclusion is that it's possible for an enum to implement an interface if it doesn't have methods. But you cannot create it in C#. Using that enum in a C# program is funny: if you check if the value "is IMyInterface", the compiler warns you that the expression is never of that type.
No, we cannot extend an enum in Java. Java enums can extend java. lang. Enum class implicitly, so enum types cannot extend another class.
Define a method that allows you to add Elements into the set, BUT use a constraint for that parameter...
public <E extends Enum<E> & IMyInterface> void addToSet(final E value) { }
now after that
addToSet(MyEnum.K) will compile
but
addToSet(new Myclass()) will NOT compile
AFAIK it is not possible to enforce an implementor of an interface to have certain properties such as being an enum.
However, depending on your code and how you use that interface you can make it hard for someone not to make the implementor an enum:
T
to implement App<T>
as well to prevent passing any enum to the class declaration (i.e. App<T extends Enum<T> & App<T>>
)Enum
such as name()
, ordinal()
, getDeclaringClass()
etc.App<T ...>
extend Comparable<T>
.getClass().isEnum()
to check that property at runtime. This is not ideal but there are similar solution's that are commonly used such as Collections.unmodifiableSet()
.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With