### Question:
TypeLiteral { static <T> TypeLiteral<T> normalize(TypeLiteral<T> type) { Objects.requireNonNull(type, "Null type"); if(type.getClass() == TypeLiteral.class) { return type; } return new TypeLiteral<>(type.getRawType(), type.argumentTypes); } @SuppressWarnings("unchecked") protected  TypeLiteral(); @SuppressWarnings("unchecked") private  TypeLiteral(Type type); private  TypeLiteral(Class<? super T> type, String... argumentTypes); private  TypeLiteral(Class<? super T> type, Type... argumentsType); static TypeLiteral<T> of(Class<T> type); static TypeLiteral<T> of(Type type); static TypeLiteral<T> of(Class<T> rawType, Type... parameters); static TypeLiteral<List<T>> listOf(Class<? extends T> type); static TypeLiteral<List<T>> listOf(TypeLiteral<? extends T> type); static TypeLiteral<Set<T>> setOf(Class<? extends T> valueType); static TypeLiteral<Set<T>> setOf(TypeLiteral<? extends T> valueType); static TypeLiteral<Map<K, V>> mapOf(Class<? extends K> keyType, Class<? extends V> valueType); static TypeLiteral<Map<K, V>> mapOf(TypeLiteral<? extends K> keyType, TypeLiteral<? extends V> valueType); static TypeLiteral<Optional<T>> optionalOf(Class<? extends T> type); static TypeLiteral<Optional<T>> optionalOf(TypeLiteral<? extends T> type); Class<? super T> getRawType(); @Override boolean equals(Object o); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void testNormalize() { TypeLiteral<List<Integer>> type1 = TypeLiteral.listOf(Integer.class); TypeLiteral<List<Integer>> type2 = new TypeLiteral<List<Integer>>(){}; TypeLiteral<List<Integer>> type3 = TypeLiteral.normalize(type1); TypeLiteral<List<Integer>> type4 = TypeLiteral.normalize(type2); assertEquals(type1, type3); Assert.assertSame(type1, type3); assertEquals(type2, type4); Assert.assertNotSame(type2, type4); }