Я чувствую, что то, что вы хотите сделать, является рефлексивным созданием экземпляра класса, который может быть общим.
Является ли это точным?
По всем причинам, которые уже обсуждались, в Java 8 нет способа сделать это без предупреждения о компиляторе, но это не означает, что ваш код не является безопасным по типу. Предупреждение означает, что он не может гарантировать, что ваш код безопасен по типу. Если вы можете доказать себе, что ваш код в безопасности, то целесообразно (и полезно) подавить предупреждение для безопасного кода типа.
Вот пример метода, который создает и возвращает объект того же типа, что в комплекте поставки аргумента:
public static <T> T createInstanceFrom(T myInstance) {
@SuppressWarnings("unchecked")
Class<T> myType = (Class<T>) myInstance.getClass();
T instance = myType.newInstance();
return instance;
}
Потому что нет типа безопасного способа бросить к универсальному типу, приведенное выше, генерирует предупреждение о компиляторе, сообщающее вам, что ваш код не может быть безопасным по типу. Однако вы можете сами проанализировать код. В этом случае myInstance
, instance
и myType
должны всегда иметь общий объект Class
. Поскольку вы можете доказать, что код безопасен по типу, важно подавить предупреждение (и добавить комментарий, объясняющий, почему код является безопасным).
Вы можете доказать, что это типобезопасно:
List<String> stringList = new ArrayList<>();
List<String> myList1 = createInstanceFrom(stringList);
List<Integer> myList2 = createInstanceFrom(stringList);
List myList3 = createInstanceFrom(stringList);
Метод createInstanceFrom
-must- возвращает объект с тем же типом в качестве аргумента, поэтому линия с myList1
компилирует, но линия с myList2
генерирует ошибка компилятора. Строка с myList3
компилирует, но генерирует предупреждение компилятора, потому что, опять же, если вы используете необработанный тип, компилятор не может гарантировать вам, что этот код безопасен по типу. Здесь, однако, нет способа доказать, что этот код безопасен (и поэтому этот код должен быть переработан в нечто более безопасное).
Какое предупреждение вы получаете? – Keews
Это не помогает, что мы не знаем, чего вы пытаетесь достичь - пытаетесь ли вы получить ссылку «Class» для «MyClass» с определенным аргументом типа или только с сырым типом? –
Не знаю ваш прецедент, но я использую MyClass, чтобы добавить гарантию времени компиляции, что T - это правильный тип экземпляра класса. –
cYrixmorten