Необработанный тип - это имя общего класса или интерфейса без аргументов типа. Например, с учетом общего класса Box:
public class Box {
public void set(T t) { /* ... */ }
// ...
}
Чтобы создать параметризованный тип Box
, вы указываете фактический аргумент типа для параметра формального типа T
:
Box intBox = new Box<>();
Если аргумент фактического типа опущен, вы создаете необработанный тип Box
:
Box rawBox = new Box();
. Поэтому Box
является необработанным типом родового типа Box
. Однако не общий тип или тип интерфейса не является сырым типом.
Необработанные типы отображаются в устаревшем коде, потому что многие классы API (например, классы Collections) не были типичными до JDK 5.0. При использовании сырых типов вы, по существу, получаете поведение перед генериками - Box
дает вам Object
s. Для обратной совместимости допускается присвоение параметризованного типа его необработанному типу:
Box stringBox = new Box<>();
Box rawBox = stringBox; // OK
Но если вы назначаете сырой тип параметризованному типу, вы получите предупреждение:
Box rawBox = new Box(); // rawBox is a raw type of Box
Box intBox = rawBox; // warning: unchecked conversion
Вы также получаете предупреждение, если используете необработанный тип для вызова общих методов, определенных в соответствующем родовом типе:
Box stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8); // warning: unchecked invocation to set(T)
Предупреждение показывает, что необработанные типы обходят общие проверки типа, откладывая улов небезопасных код для выполнения. Поэтому вам следует избегать использования необработанных типов.
В разделе «Тип стирания» содержится дополнительная информация о том, как компилятор Java использует необработанные типы.
As упомянутый ранее, при смешивании устаревшего кода с общим кодом вы можете столкнуться с предупреждающими сообщениями, подобными следующим:
Примечание: Example.java использует непроверенные или небезопасные операции.
Примечание. : Перекомпиляция с -Xlint: не проверяется для деталей.
Это может произойти при использовании более старого API, который работает с необработанными типами, как показано в следующем примере:
public class WarningDemo { public static void main(String[] args){ Box
bi; bi = createBox(); } static Box createBox(){ return new Box(); } } Термин «непроверенный» означает, что компилятор не имеет достаточной информации о типе для выполнения всех проверок типа, необходимых для обеспечения безопасности типа. Предупреждение «unchecked» по умолчанию отключено, хотя компилятор дает подсказку. Чтобы просмотреть все «непроверенные» предупреждения, перекомпилируйте с помощью -Xlint: unchecked.
Повторная компиляция предыдущего примера с -Xlint: unchecked показывает следующую дополнительную информацию:
WarningDemo.java:4: warning: [unchecked] unchecked conversion found : Box required: Box
bi = createBox(); ^ 1 warning Чтобы полностью отключить unchecked warnings, используйте флаг -Xlint: -unchecked. Аннотации
@SuppressWarnings("unchecked")
подавляют непроверенные предупреждения. Если вы не знакомы с синтаксисом@SuppressWarnings
, см. Аннотации.Исходный источник: Учебники по Java
с использованием пакета Fiber
var Fiber = Npm.require('fibers');
...
Meteor.methods({
callAsync: function (args) {
var fiber = Fiber.current;
async(function (args) {
...
fiber.run(res);
});
return Fiber.yield();
}
});
Для кого-то нового для Метеор, который видит этот вопрос и задается вопросом , почему необходима библиотека, такая как Future или Fiber, это потому, что вызов amazon.execute является асинхронным.
В Javascript , многие операции, которые занимают длительный период времени, не запускают одну строку после следующего; Примеры, например, запись в базу данных с помощью window.setTimeout или выполнение HTTP-запросов. С такими методами, исторически вам нужно было обернуть код, который вы хотите запустить после факта в обратном вызове.
Future and Fibers обеспечивают синтаксический сахар и дополнительные функции, но их основная функциональность одинакова.
Meteor использует специальные закулисные трюки, чтобы сделать определенные встроенные операции (например, доступ к MongoDB) синхронными, хотя все еще использует повышенную производительность асинхронного кода. По этой причине вам обычно приходится беспокоиться об асинхронном использовании при использовании внешних пакетов (например, Amazon в этом примере).
Здесь полностью скомпоновано пример использования как Будущего, так и Волокна:
Есть несколько замечательных статей, объясняющих характер Sync / Async в Метеор на блоге Discover Meteor и в Метеорном Поваре
Методы Метеор являются асинхронными, вы можете получить результат многими способами.
Использование модулей модуля npm (другой ответ объясняет это очень четко).
Есть некоторые другие путь без использования модуля npm:
Через переменную сеанса:
Meteor.call('myMethod',args, function(error, result) {
if (error) { Session.set('result', error) } // Note that the error is returned synchronously
else {
Session.set('result', result) // Using : Session.get('result') will return you the result of the meteor call !
}
});
Или через шаблонную переменную:
Template.hello.onCreated(function helloOnCreated() {
// counter starts at 0
this.message = new ReactiveVar(0);
});
Template.hello.helpers({
message() {
return Template.instance().message.get();
},
});
Template.hello.events({
'click button'(event, instance) {
Meteor.call('myMethod', args, function (error, result) {
if (error) { Template.instance().message.set(error); }
else {
Template.instance().message.set(result);
}
})
},
});
Надеюсь, что это поможет!