Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8193583

Generic types have to be casted to proper type

XMLWordPrintable

    • x86_64
    • generic

      FULL PRODUCT VERSION :
      java version "1.8.0_152"
      Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
      Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Darwin iMac-Marcin 17.3.0 Darwin Kernel Version 17.3.0: Thu Nov 9 18:09:22 PST 2017; root:xnu-4570.31.3~1/RELEASE_X86_64 x86_64

      A DESCRIPTION OF THE PROBLEM :
      Returned generic type which is declared from inner public classes loses original type.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      I provided code below


      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Error:(7, 55) java: cannot find symbol
        symbol: method getActionButtonEvent()
        location: class com.marurban.BaseViewModel<com.marurban.FavoriteLeaguesViewModel.Accessor,com.marurban.FavoriteLeaguesViewModel.ViewEvents,com.marurban.FavoriteLeaguesViewModel.FlowEvents>.FlowEvents

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      public class Main {

          public static void main(String[] args) {

              new FavoriteLeaguesViewModel().getFlowEvents().getActionButtonEvent();
          }
      }

      public abstract class BaseViewModel<FlowEvents extends BaseViewModel.FlowEvents> {

          private FlowEvents flowEvents;

          public BaseViewModel() {
              flowEvents = createFlow();
          }

          protected abstract FlowEvents createFlow();

          public FlowEvents getFlowEvents() {
              return flowEvents;
          }

          public class FlowEvents {
          }
      }

      public abstract class FavoritesViewModel<FlowEvents extends FavoritesViewModel.FlowEvents>
              extends BaseViewModel<FlowEvents> {

          List list;

          public FavoritesViewModel() {
              super();
          }

          public abstract class FlowEvents extends BaseViewModel.FlowEvents {

              public List getActionButtonEvent() {
                  return list;
              }
          }
      }


      public class FavoriteLeaguesViewModel extends FavoritesViewModel<FavoriteLeaguesViewModel.FlowEvents> {

          public FavoriteLeaguesViewModel() {
              super();
          }

          @Override
          protected FlowEvents createFlow() {
              return new FlowEvents();
          }

          public class FlowEvents extends FavoritesViewModel.FlowEvents {

          }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      You need to explicitly cast to proper class.

      public class Main {

          public static void main(String[] args) {
              FavoriteLeaguesViewModel viewModel = new FavoriteLeaguesViewModel();
              FavoriteLeaguesViewModel.FlowEvents flowEvents = (FavoriteLeaguesViewModel.FlowEvents) viewModel.getFlowEvents();
              flowEvents.getActionButtonEvent();
          }
      }


        1. BaseViewModel.java
          0.4 kB
          Fairoz Matte
        2. FavoriteLeaguesViewModel.java
          0.3 kB
          Fairoz Matte
        3. FavoritesViewModel.java
          0.4 kB
          Fairoz Matte
        4. Main.java
          0.4 kB
          Fairoz Matte

            vromero Vicente Arturo Romero Zaldivar
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: