Во-первых, убедитесь, что в вашем каталоге python. Обычно он находится в C:\Python27
. Если у вас другое, измените его из следующей команды.
Если после установки python все еще не распознается, в PowerShell введите это:
[Environment] :: SetEnvironmentVariable («Путь», «$ env: Путь; C: \ Python27», «Пользователь»)
Закройте PowerShell, а затем запустите его снова, чтобы убедиться, что Python теперь запущен. Если этого не произойдет, может потребоваться перезагрузка.
как метод выводит тип
blockquote><T>
Это не так. Общие методы не вызывают их общие типы - вот почему
T
называется параметром типа . Вызывающий метод предоставляет аргумент типа дляT
. Когда это произойдет, может быть выведено компилятором на основе контекста аргументов вызова метода и целевого типа.Например:
Set<String> c = Collections.emptySet();
emptySet
объявляет параметр типаT
, не принимает аргументов и возвращаетSet<T>
. Здесь компилятор сообщаетT
какString
на основе целевого типаSet<String>
.Другой пример:
Collections.singleton("asdf");
singleton
объявляет параметр типаT
, принимает значениеT
и возвращаетSet<T>
. Здесь нет целевого типа, но компилятор сообщаетT
какString
на основе аргумента"asdf"
.Но типичный вывод типа - это просто удобство. Без него мы все равно могли бы использовать свидетелей типа типа для явного предоставления аргументов типа:
Set<String> c = Collections.<String>emptySet(); Collections.<String>singleton("asdf");
Это приводит нас к вашей сигнатуре метода:
public <T> void fromJsonArray(String jsonString, Type tToken)
fromJsonArray
объявляет параметр типаT
, но не возвращает ничего, связанного с типомT
, или принимает аргументы, относящиеся кT
. При вызовеfromJsonArray
компилятор не имеет информации, из которой следует вывестиT
. Его аргумент типа по умолчанию будет равен его верхней границеObject
, если не используется тип свидетеля:myObj.<String>fromJsonArray(jsonString, tToken);
Но это не имеет значения, поскольку
<String>
не влияет на поведение вызова метода или его компиляции.T
бессмысленна * и может быть удалена из объявленияfromJsonArray
.как компилятор присваивает значение, возвращаемое методом
blockquote>fromJson
, переменнаяlist
, тип которой i не указана?Вот источник
Gson.fromJson(String, Type)
:@SuppressWarnings("unchecked") public <T> T fromJson(String json, Type typeOfT) throws JsonParseException { StringReader reader = new StringReader(json); T target = (T) fromJson(reader, typeOfT); return target; }
Вы может видеть, что он объявляет произвольный параметр типа
T
и отбрасывает десериализованный объект наT
. Это известно как unchecked cast , потому что он не будет работать быстро, если это неправильно. Это потому, чтоT
был удален во время выполнения. Вы можете видеть, что код подавляет предупреждение об этом, потому что это, как правило, плохая идея. Не ограничивая то, чтоT
основано на аргументах метода, код Gson эффективно уступил контроль над ним вызывающему. Если вы написали:List<String> list = g.fromJson(jsonString, tToken);
, но
tToken
представленыHashSet<String>
, вы получитеClassCastException
в этой строке во время выполнения. Хуже того, еслиtToken
представленArrayList<Integer>
, он даже не потерпит неудачу в этой строке, потому что JVM увидит толькоList
и разрешит выполнение задания. AClassCastException
будет выпущен спустя некоторое время, как только ваш код попытается обработать элементыInteger
в списке, такие какString
s (и исключение будет путать с отладкой).Итак, чтобы ответить на ваш вопрос о назначении компилятор позволяет присваивать результат
fromJson
всем, что угодно. Это зависит от вас, чтобы это было правильно.Вы можете спросить: почему Gson делает непроверенный бросок и разрешает небезопасный код? Ответ заключается в том, что это удобство, связанное с языковыми ограничениями. Их другая подпись более безопасна:
public <T> T fromJson(String json, Class<T> classOfT)
Но нет способа представить общие типы с помощью
Class
- noList<String>.class
, например. ТолькоType
может это сделать, и он не является общим.fromJson
может потребоватьTypeToken<T>
, но есть другие способы получитьType
, поэтому это будет ограничительным.Возврат
Object
и принуждение вызывающего к выполнению непроверенного акта были более прозрачными, но разработчики Gson, вероятно, хотели избежать этого «уродства».
T list = g.fromJson(jsonString,tToken);
Он выводится из типа возврата g.fromJson().
fromJson
выводится из параметра типа, мне хотелось бы знать, как этот вывод помогает вывести тип T
в моем методе
– Thirumalai Parthasarathi
9 March 2014 в 18:33
toRawClass
сfromJson
? – Paul Bellora 10 March 2014 в 04:24