Дженерики Java: Универсальный тип, определенный как возврат, вводит только

67
задан Barry Fruitman 18 November 2015 в 20:01
поделиться

5 ответов

Метод возвращает тип того, чем Вы ожидаете, что он будет (<X>, определяется в методе и абсолютно неограничен).

Это очень, очень опасно, поскольку никакое условие не сделано этим, тип возврата на самом деле соответствует возвращенному значению.

единственное преимущество, которое это имеет, состоит в том, что Вы не должны бросать возвращаемое значение таких универсальных методов поиска, которые могут возвратить любой тип.

я сказал бы: используйте такие конструкции с осторожностью, потому что Вы теряете в значительной степени всю безопасность типов и получаете только, что Вы не должны писать явному броску в каждом вызове к get().

И да: это в значительной степени - черная магия, которая аварийно завершается во времени выполнения и повреждает всю идею того, чего должны достигнуть дженерики.

54
ответ дан Michael Myers 24 November 2019 в 14:41
поделиться

Тип объявляется на методе. Это, это" <X>" означает. Тип ограничен по объему тогда только к методу и относится к конкретному вызову. Причина, которую компилирует Ваш тестовый код, состоит в том, что компилятор пытается определить тип и будет жаловаться, только если это не может. Существуют случаи, где необходимо быть явными.

, Например, объявление для Collections.emptySet()

public static final <T> Set<T> emptySet()

В этом случае, компилятор может предположить:

Set<String> s = Collections.emptySet();

, Но если это не может, необходимо ввести:

Collections.<String>emptySet();
39
ответ дан sblundy 24 November 2019 в 14:41
поделиться

BaseModelData повышает неконтролируемые предупреждения, когда скомпилировано, потому что это небезопасно. Используемый как это, Ваш код бросит ClassCastException во время выполнения, даже при том, что это не имеет никаких предупреждений само.

public String getExpireDate() {
  return  get("expiredate");
}
2
ответ дан erickson 24 November 2019 в 14:41
поделиться

Интересное примечание, от RpcMap (GXT API 1.2)

заголовок get:

public java.lang.Object get(java.lang.Object key)

Наличие универсального параметра <X> там, это не инстанцируют, имеет тот же эффект, кроме Вас не должны говорить "Объект" повсеместно. Я соглашаюсь с другим плакатом, это неаккуратно и немного опасно.

2
ответ дан Michael Myers 24 November 2019 в 14:41
поделиться

Да, это опасно. Обычно, Вы защитили бы этот код как так:

<X> getProperty(String name, Class<X> clazz) {
   X foo = (X) whatever(name);
   assert clazz.isAssignableFrom(foo);
   return foo;
}

String getString(String name) {
  return getProperty(name, String.class);
}

int getInt(String name) {
  return getProperty(name, Integer.class);
}
0
ответ дан paulmurray 24 November 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: