fork(2) download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. import java.lang.reflect.ParameterizedType;
  8. import java.util.stream.Collectors;
  9.  
  10. /* Name of the class has to be "Main" only if the class is public. */
  11. class Ideone
  12. {
  13.  
  14. interface SecondaryCode{}
  15.  
  16. enum AccumSecondaryCode implements SecondaryCode {
  17. MORE_THREE_YEARS("07");
  18.  
  19. private AccumSecondaryCode( String code ) {};
  20. }
  21.  
  22. public enum CreditSecondaryCode implements SecondaryCode {
  23. UP_TO_ONE_YEAR("04");
  24.  
  25. private CreditSecondaryCode( String code ) {};
  26. }
  27.  
  28. abstract static class PrimaryOperation<CODE extends SecondaryCode> {
  29. // can't use diamond in with anonymous classes in java-8
  30. static PrimaryOperation<AccumSecondaryCode> ACCUM = new PrimaryOperation<AccumSecondaryCode>() {};
  31.  
  32. static PrimaryOperation<CreditSecondaryCode> CREDIT = new PrimaryOperation<CreditSecondaryCode>(){};
  33.  
  34. private PrimaryOperation() {}
  35.  
  36. @SuppressWarnings("unchecked")
  37. public List<CODE> validSecondaryCodes() {
  38. ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
  39.  
  40. Class<?> parameter = (Class<?>)type.getActualTypeArguments()[0];
  41.  
  42. return Arrays.stream(parameter.getEnumConstants()).map( o -> (CODE)o ).collect( Collectors.toList() );
  43. }
  44. }
  45.  
  46. static <CODE extends SecondaryCode> void createAccount( PrimaryOperation<CODE> primary, CODE secondary ) {
  47. }
  48.  
  49. public static void main (String[] args) throws java.lang.Exception
  50. {
  51. createAccount( PrimaryOperation.ACCUM, AccumSecondaryCode.MORE_THREE_YEARS );
  52.  
  53. // this does not compile
  54. //createAccount( PrimaryOperation.ACCUM, CreditSecondaryCode.UP_TO_ONE_YEAR );
  55.  
  56. System.out.println( PrimaryOperation.CREDIT.validSecondaryCodes() );
  57. }
  58. }
Success #stdin #stdout 0.15s 2184192KB
stdin
Standard input is empty
stdout
[UP_TO_ONE_YEAR]