Я думаю, что первый метод должен выглядеть примерно так:
public static <T> T create(final String className, Class<T> ifaceClass)
throws ClassNotFoundException {
final Class<T> clazz = Class.forName(className).asSubclass(ifaceClass);
return create(clazz);
}
Вы не можете выполнить приведение типов с использованием параметра типа ... без этих надоедливых предупреждений о безопасности типов.
Кстати, если вы игнорируете эти предупреждения, метод create может создать экземпляр некоторого класса, который не совместим с фактическим типом, используемым вызывающей стороной. Это может привести к неожиданному исключению ClassCastException позже; например когда экземпляр назначен.
EDIT: @Pascal указывает, что нам нужно добавить typecast, чтобы сделать эту компиляцию; т.е.
Class<T> clazz = (Class<T>) Class.forName(className).asSubclass(ifaceClass);
К сожалению, нам также необходимо добавить аннотацию @SuppressWarnings.