import java.math.BigDecimal;
import java.util.*;
import lombok.val;
public class ValWeirdTypes<Z> {
  private List<Z> fieldList;
  public ValWeirdTypes() {
    super();
  }
  public void testGenerics() {
    List<String> list = new ArrayList<String>();
    list.add("Hello, World!");
    final @val java.lang.String shouldBeString = list.get(0);
    final @val java.util.List<java.lang.String> shouldBeListOfString = list;
    final @val java.util.List<java.lang.String> shouldBeListOfStringToo = Arrays.asList("hello", "world");
    final @val java.lang.String shouldBeString2 = shouldBeListOfString.get(0);
  }
  public void testGenericsInference() {
    final @val java.util.List<java.lang.Object> huh = Collections.emptyList();
    final @val java.util.List<java.lang.Number> huh2 = Collections.<Number>emptyList();
  }
  public void testPrimitives() {
    final @val int x = 10;
    final @val long y = (5 + 3L);
  }
  public void testAnonymousInnerClass() {
    final @val java.lang.Runnable y = new Runnable() {
      x() {
        super();
      }
      public void run() {
      }
    };
  }
  public <T extends Number>void testTypeParams(List<T> param) {
    final @val T t = param.get(0);
    final @val Z z = fieldList.get(0);
    final @val java.util.List<T> k = param;
    final @val java.util.List<Z> y = fieldList;
  }
  public void testBounds(List<? extends Number> lower, List<? super Number> upper) {
    final @val java.lang.Number a = lower.get(0);
    final @val java.lang.Object b = upper.get(0);
    final @val java.util.List<? extends java.lang.Number> c = lower;
    final @val java.util.List<? super java.lang.Number> d = upper;
    List<?> unbound = lower;
    final @val java.util.List<?> e = unbound;
    final @val java.lang.Object f = unbound.get(0);
  }
  public void testCompound() {
    final @val java.util.ArrayList<java.lang.String> a = new ArrayList<String>();
    final @val java.util.Vector<java.lang.String> b = new Vector<String>();
    final @val boolean c = (1 < System.currentTimeMillis());
    final @val java.util.AbstractList<java.lang.String> d = (c ? a : b);
    java.util.RandomAccess confirm = (c ? a : b);
  }
  public void nullType() {
    final @val java.lang.Object nully = null;
  }
  public void testArrays() {
    final @val int[] intArray = new int[]{1, 2, 3};
    final @val java.lang.Object[][] multiDimArray = new Object[][]{{}};
    final @val int[] copy = intArray;
    final @val java.lang.Object[] single = multiDimArray[0];
    final @val int singleInt = copy[0];
  }
  public void arraysAsList() {
    final @val java.util.List<java.lang.Class<? extends java.io.Serializable>> x = Arrays.asList(String.class, BigDecimal.class);
    for (final @val java.lang.Class<? extends java.io.Serializable> y : x)
      {
      }
  }
  public @SuppressWarnings("all") void arraysAsList2() {
    final @val java.util.List<java.lang.Class<? extends java.lang.Comparable>> x = Arrays.asList(String.class, BigDecimal.class, Comparable.class);
    for (final @val java.lang.Class<? extends java.lang.Comparable> y : x)
      {
      }
  }
}