Что такое типы raw в Java и почему я часто слышу, что они не должны использоваться в новом коде?
blockquote>Необработанные типы - это древняя история Java язык. В начале были
Collections
, и они больше не держалиObjects
и ничего меньше. Каждая операция наCollections
требовала отличных отObject
желаемого типа.List aList = new ArrayList(); String s = "Hello World!"; aList.add(s); String c = (String)aList.get(0);
Хотя это продолжалось большую часть времени, произошли ошибки
List aNumberList = new ArrayList(); String one = "1";//Number one aNumberList.add(one); Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here
Старый нетривиальные коллекции не могли обеспечить безопасность типов, поэтому программисту приходилось запоминать то, что он хранил в коллекции. Генераторы, изобретенные, чтобы обойти это ограничение, разработчик объявит сохраненный тип один раз, и компилятор сделает это вместо этого.
List
aNumberList = new ArrayList (); aNumberList.add("one"); Integer iOne = aNumberList.get(0);//Compile time error String sOne = aNumberList.get(0);//works fine Для сравнения:
// Old style collections now known as raw types List aList = new ArrayList(); //Could contain anything // New style collections with Generics List
aList = new ArrayList (); //Contains only Strings Более сложный Интерфейс Compareable:
//raw, not type save can compare with Other classes class MyCompareAble implements CompareAble { int id; public int compareTo(Object other) {return this.id - ((MyCompareAble)other).id;} } //Generic class MyCompareAble implements CompareAble
{ int id; public int compareTo(MyCompareAble other) {return this.id - other.id;} } Обратите внимание, что невозможно реализовать интерфейс
CompareAble
сcompareTo(MyCompareAble)
с необработанными типами. Почему вы не должны их использовать:
- Любое
Object
, хранящееся вCollection
, должно быть выполнено до его использования- Использование обобщений позволяет проверять время компиляции
- Использование исходных типов - это то же самое, что и сохранение каждого значения как
Object
Что делает компилятор: Дженерики обратно совместимы, они используют одни и те же классы java, типы делают.
List
someStrings = new ArrayList (); someStrings.add("one"); String one = someStrings.get(0); Будет скомпилирован как:
List someStrings = new ArrayList(); someStrings.add("one"); String one = (String)someStrings.get(0);
Это тот же код, который вы бы написали, если вы использовали исходные типы напрямую. Думаю, я не уверен, что происходит с интерфейсом
CompareAble
, я предполагаю, что он создает две функцииcompareTo
, одна из которых принимаетMyCompareAble
, а другая принимаетObject
и передает ее первой после ее литья.Каковы альтернативы сырым типам: используйте generics
вам не нужно вытягивать атрибут «картинка». есть намного более удобный способ, единственное, что вам нужно - это userid, см. пример ниже;
https://graph.facebook.com/user_id/picture?type=large
стр. s. тип определяет размер, который вы хотите
plz, помните, что используя токен с базовыми разрешениями, / me / friends вернут список друзей только с атрибутами id + name
У меня такая же проблема, но я попытался решить эту проблему. он возвращает большое изображение. Это не идеальное решение, но вы можете попробовать это.
https://graph.facebook.com/v2.0/OBJECT_ID/picture?access_token=XXXXX
Вы можете указать ширину и; высота в вашем запросе к графику Facebook api: http://graph.facebook.com/user_id/picture?width=500&heigth=500
Вариант в стиле JS. Просто установите огромную ширину изображения, и вы получите самый большой вариант.
FB.api(
'/' + userId,
{fields: 'picture.width(2048)'},
function (response) {
if (response && !response.error) {
console.log(response.picture.data.url);
}
}
);
попытайтесь изменить размер изображения, изменив размер пикселя с url в каждом объекте json следующим образом:
например, я изменяю s480x480 как s720x720
Я исследовал Graph API Explorer широко и, наконец, нашел full_picture
https://graph.facebook.com/v2.2/$id/posts?fields=picture,full_picture
P.S. Я заметил, что full_picture не всегда будет предоставлять полноразмерный образ, который я хочу. [attachments] делает
https://graph.facebook.com/v2.2/$id/posts?fields=picture,full_picture,attachments
Измените массив полей id,name,picture
на id,name,picture.type(large)
https://graph.facebook.com/v2.8/me?fields=id,name,picture.type(large)&access_token=<the_token>
Результат:
{
"id": "130716224073524",
"name": "Julian Mann",
"picture": {
"data": {
"is_silhouette": false,
"url": "https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/15032818_133926070419206_3681208703790460208_n.jpg?oh=a288898d87420cdc7ed8db5602bbb520&oe=58CB5D16"
}
}
}
Graph returned an error: (#100) For field 'picture': type must be one of the following values: thumbnail, small, album
– Honza
14 October 2017 в 21:33
Вы можете использовать full_picture вместо клавиши изображения, чтобы получить изображение полного размера.
Лучший способ получить всех друзей (которые тоже используют приложение тоже, конечно) с правильными размерами изображений - использовать расширение field , либо с одним из тегов размера (квадратный, нормальный, большой):
/me/friends?fields=picture.type(large)
(изменить: это больше не работает)
... или вы можете указать ширину / высоту:
me/friends?fields=picture.width(100).height(100)
Btw, вы также можете записать его так:
me?fields=friends{picture.type(large)}
Хм ... Я думаю, что нашел решение.
На самом деле, in может просто запросить
https://graph.facebook.com/me/friends?fields=id,name
Согласно http: // разработчикам .facebook.com / docs / reference / api / (раздел «Картинки»), URL-адрес фотографий профиля может быть создан с идентификатором пользователя
Например, если идентификатор пользователя находится в $ id :
"http://graph.facebook.com/$id/picture?type=square"
"http://graph.facebook.com/$id/picture?type=small"
"http://graph.facebook.com/$id/picture?type=normal"
"http://graph.facebook.com/$id/picture?type=large"
Но это не окончательный URL-адрес изображения, поэтому, если у кого-то есть лучшее решение, я был бы рад узнать:)
Из v2.7
, /<picture-id>?fields=images
предоставит вам список с разным размером изображений, первый элемент будет полноразмерным изображением.
Я не знаю ни одного решения для нескольких изображений сразу.
Я думаю, что теперь единственный способ получить большие фотографии друзей - использовать FQL. Во-первых, вам нужно получить список друзей:
https://graph.facebook.com/me/friends
Затем проанализируйте этот список и Извлеките всех друзей ids
. Если у вас есть это, просто выполните следующий запрос FQL:
SELECT id, url FROM profile_pic WHERE id IN (id1, id2) AND width=200 AND height=200
200
здесь просто примерный размер, вы можете ввести что угодно. Вы должны получить следующий ответ:
{
"data": [
{
"id": ...,
"url": "https://fbcdn-profile-a.akamaihd.net/..."
},
{
"id": ...,
"url": "https://fbcdn-profile-a.akamaihd.net/..."
}
]
}
. Каждый URL-адрес является ссылкой на образ 200x200px.
Вы можете установить размер изображения в пикселях, например:
https://graph.facebook.com/v2.8/me?fields=id,name,picture.width(500).height(500)
Аналогичным образом можно использовать параметр type
{user-id}/?fields=name,picture.type(large)
From документация
type enum {small, normal, album, large, square}
blockquote>
В URL-адресах изображений, найденных в ответах Graph (« http://photos-c.ak.fbcdn.net/ », просто замените по умолчанию «_s.jpg» на « _n.jpg "(? нормальный размер) или" _b.jpg "(? большой размер) или" _t.jpg "(thumbnail).
Hacakable URLs / REST API улучшают работу в Интернете.
Пользователи rest-fb (квадратное изображение, большее разрешение): Connection myFriends = fbClient.fetchConnection ("me / friends", User.class, Parameter.with ("поля", "public_profile, email, first_name, last_name, пола, picture.width (100) .height (100) "));
Вы также можете попробовать получить изображение, если хотите, исходя из высоты или ширины
https://graph.facebook.com/user_id/picture?height=
ИЛИ
https://graph.facebook.com/user_id/picture?width=
Значения по умолчанию в пикселях вам просто нужно указать значение int
Как описано в этой ошибке на Facebook, вы также можете запросить конкретные размеры изображений теперь с помощью нового синтаксиса API [ field ].
Например:
https://graph.facebook.com/____OBJECT_ID____?fields=picture.type(large)