Why Gigster?
    • Top talentTop talent
    • Managed serviceManaged service
    • Liquid workforceLiquid workforce
    • Scalable infrastructureScalable infrastructure
    • Enterprise securityEnterprise security
      Why Gigster?
      • Top talentTop talent
      • Managed serviceManaged service
      • Liquid workforceLiquid workforce
      • Scalable infrastructureScalable infrastructure
      • Enterprise securityEnterprise security

      Java Interview Question

      Use this advanced question and answer to prepare for your next Java interview.

      Is the code compile-time and run-time safe? What do I and K stand for? What is the use of the extends keyword in both places? Explain the get method definition. Explain the wildcard symbols.

      class A<K, I extends List<K>> {
        public K get(final int index, final I list) {
          return list.get(idx);
        }
      }
      
      class B extends A<String, LinkedList<String>> { }
      
      Class C {
        public static void main(String...args) {
          A<Integer, ArrayList<Integer>> a = new A<>;
          B b = new B();
          A<?, ?> g;
          A<? extends Integer, ?> f;
          g = a;
          g = b;
          f = a;
        }
      }
      


      Yes, this code is compile-time and run-time safe.

      I and K are Generic type parameters used to ensure type safety.

      The extends keyword in the first line defines the scope of the I parameter. The I parameter can only be a sub-type of List of type K. K by default extends Object.

      The second extends keyword is used for inheriting class A and fixing the type parameters of A to String and LinkedList.

      The get method takes an index integer and a List of type K as the parameters. It returns the list value at index, which will have a return type K because the list parameter is fixed to K.

      For example, when get is called on instance b of class B, get will take a LinkedList<String> and return the String at index.

      The wildcard symbols indicate that g can have any type within the bounds of the parameters. That is why a and b can be assigned to it. In the case of f, the first parameter gets limited to Integer sub-types, so only a can be assigned to it, not b. f can be assigned to g, but not the other way round.

      Looking for developers?