Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement an interface with an enum, where the interface extends Comparable?

Consider this code:

public interface Foo extends Comparable<Foo> {}

public enum FooImpl implements Foo {}

Due to the restrictions of type erasure, I receive the following error:

java.lang.Comparable cannot be inherited with different arguments: <Foo> and <FooImpl>

I have the following requirements:

  • FooImpl needs to be an enum, because I need to use it as a default value in annotations.
  • The contract of my interface is that it needs to be comparable.

I already tried using generic bounds in the interface, but this is not supported in Java.

like image 754
soc Avatar asked Aug 23 '11 12:08

soc


2 Answers

Enums implement Comparable, so FooImpl ends up extending Comparable twice with incompatible arguments.

The following will work:

public interface Foo<SelfType extends Foo<SelfType>> extends Comparable<SelfType> { ... }

public enum FooImpl implements Foo<FooImpl> { ... }
like image 125
jvdneste Avatar answered Oct 05 '22 23:10

jvdneste


Enum already implements comparable so you can't override it.

A general answer regarding why-would-an-enum-implement-an-interface.

like image 32
NimChimpsky Avatar answered Oct 06 '22 00:10

NimChimpsky