Двоичные объекты в StreamReceiver и универсальные типыJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Двоичные объекты в StreamReceiver и универсальные типы

Сообщение Anonymous »

Я пытаюсь понять, как правильно работать с StreamReceiver, которые используются с IgniteDataStreamer, где установлен параметр KeepBinary(true). Рассмотрим этот код:

Код: Выделить всё

IgniteDataStreamer streamer = ignite.dataStreamer(cacheName);
streamer.keepBinary(true);
streamer.receiver(new MyReceiver());
Теперь дело в том, что MyReceiver должен реализовать StreamReceiver, но нет > StreamReceiver — иначе приведенный выше код не скомпилируется. В результате метод получения выглядит так:

Код: Выделить всё

public class MyReceiver implements StreamReceiver {
@Override
void receive(IgniteCache cache,
Collection entries) {
//
}
}
Теперь ключ и значение, которые входят в коллекцию записей, не являются MyPojoKey и MyPojoEntity! Поскольку метод KeepBinary был вызван выше с true, они являются BinaryObjectImpl, где BinaryObjectImpl — это тип Ignite, что возможно только благодаря стиранию типов в Java. Конечно, я могу привести их к правильному BinaryObject и затем работать с ними как таковые:

Код: Выделить всё

  void receive(IgniteCache cache,
Collection entries) {
entries.forEach(entry -> {
// Notice I can't do "MyPojoEntity en = entry.getValue()" - that would throw ClassCastException
BinaryObject binaryEntity = (BinaryObject)entry.getValue();

// Notice unchecked cast to raw IgniteCache - can't compile it otherwise!
((IgniteCache)cache).put(key, binaryEntity);

});
}

Приведенный выше код работает, как и ожидалось, хотя и с теми очень грязными трюками со стиранием типов, чтобы обойти то, что эффективно является загрязнением кучи Java. Так что это немного запутанно, не так ли?
Конечно, более простой и безопасный обходной путь, вероятно, заключается в том, чтобы MyReceiver реализовывал StreamReceiver , а затем используйте необработанный тип IgniteDataStreamer:

Код: Выделить всё

 // ...
((IgniteDataStreamer)streamer).receiver(new MyReceiver()); // Cast to raw IgniteDataStreamer
// ... and where MyReceiver now implements StreamReceiver
, и в этом случае, по крайней мере, MyReceiver может быть реализован как строго типизированный. Но все равно это выглядит как грязный хак, так что я подозреваю, что это я делаю что-то не так?

Подробнее здесь: https://stackoverflow.com/questions/784 ... eric-types
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Azure BlobClient: как перебирать все большие двоичные объекты в контейнере в хронологическом порядке (по времени записи)
    Гость » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Гость
  • Как быстро скопировать большие двоичные объекты Azure в Python
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • BlobContainerClient — получить все большие двоичные объекты в корне
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Универсальные типы Swift и наследование
    Гость » » в форуме IOS
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Почему C# запрещает универсальные типы атрибутов?
    Anonymous » » в форуме C#
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»