Ответ 1
Во второй части вопроса: посмотрите на Scala язык программирования, который успешно объединил восстановленные дженерики из базовой JVM с более высокими типами. Ключевыми понятиями для этой работы являются неявные параметры и Манифесты. Манифесты используются для переноса некоторых данных стираемого типа на время выполнения, а импликации используются для приведения манифеста в класс типа, подобный тому. Сообщение в блоге Манифесты: реорганизованные типы имеет более подробную информацию.