/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.lang.reflect.ParameterizedType;
import java.util.stream.Collectors;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
interface SecondaryCode{}
enum AccumSecondaryCode implements SecondaryCode {
MORE_THREE_YEARS("07");
private AccumSecondaryCode
( String code
) {}; }
public enum CreditSecondaryCode implements SecondaryCode {
UP_TO_ONE_YEAR("04");
private CreditSecondaryCode
( String code
) {}; }
abstract static class PrimaryOperation<CODE extends SecondaryCode> {
// can't use diamond in with anonymous classes in java-8
static PrimaryOperation<AccumSecondaryCode> ACCUM = new PrimaryOperation<AccumSecondaryCode>() {};
static PrimaryOperation<CreditSecondaryCode> CREDIT = new PrimaryOperation<CreditSecondaryCode>(){};
private PrimaryOperation() {}
@SuppressWarnings("unchecked")
public List<CODE> validSecondaryCodes() {
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
Class<?> parameter = (Class<?>)type.getActualTypeArguments()[0];
return Arrays.
stream(parameter.
getEnumConstants()).
map( o
-> (CODE
)o
).
collect( Collectors.
toList() ); }
}
static <CODE extends SecondaryCode> void createAccount( PrimaryOperation<CODE> primary, CODE secondary ) {
}
{
createAccount( PrimaryOperation.ACCUM, AccumSecondaryCode.MORE_THREE_YEARS );
// this does not compile
//createAccount( PrimaryOperation.ACCUM, CreditSecondaryCode.UP_TO_ONE_YEAR );
System.
out.
println( PrimaryOperation.
CREDIT.
validSecondaryCodes() ); }
}