private void computeDeferredTypes() { Collection<Box<DeferredType>> deferredTypes = trace.getKeys(DEFERRED_TYPE); if (deferredTypes != null) { // +1 is a work around agains new Queue(0).addLast(...) bug // stepan.koltsov@ 2011-11-21 final Queue<DeferredType> queue = new Queue<DeferredType>(deferredTypes.size() + 1); trace.addHandler( DEFERRED_TYPE, new ObservableBindingTrace.RecordHandler<Box<DeferredType>, Boolean>() { @Override public void handleRecord( WritableSlice<Box<DeferredType>, Boolean> deferredTypeKeyDeferredTypeWritableSlice, Box<DeferredType> key, Boolean value) { queue.addLast(key.getData()); } }); for (Box<DeferredType> deferredType : deferredTypes) { queue.addLast(deferredType.getData()); } while (!queue.isEmpty()) { DeferredType deferredType = queue.pullFirst(); if (!deferredType.isComputed()) { try { deferredType.getActualType(); // to compute } catch (ReenteringLazyValueComputationException e) { // A problem should be reported while computing the type } } } } }