import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 

public class BugReport { 

    private class A<T> { 

        private Type type; 

        private A() { 
            ParameterizedType paramType = (ParameterizedType) this.getClass().getGenericSuperclass(); 
            this.type = paramType.getActualTypeArguments()[0]; 
        } 

        public Type getType() { 
            return type; 
        } 
    } 

     
    <T> void success() { 
        Type typeVariable = new A<T>() { 
        }.getType(); 
        Type typeArrVariable = new A<T[]>() { 
        }.getType(); 

        System.out.println(typeVariable); 
        System.out.println(typeArrVariable); 
    } 
     
    <T> void fails() { 
        Runnable exec = () -> { 
            Type typeVariable = new A<T>() {}.getType(); 
            Type typeArrVariable = new A<T[]>() {}.getType(); 

            System.out.println(typeVariable); 

            try { 
                System.out.println(typeArrVariable); 
            }catch (NullPointerException e) { 
                System.out.println("Generic Type Array failed"); 
                e.printStackTrace(); 
            } 
        }; 

        exec.run(); 
    } 
    public static void main(String[] args) {
		BugReport obj = new BugReport();
		obj.success();
		obj.fails();
		
	}

} 