MutableTypeToInstanceMap.java revision 7dd252788645e940eada959bdde927426e2531c9
17dd252788645e940eada959bdde927426e2531c9Paul Duffin/* 27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors 37dd252788645e940eada959bdde927426e2531c9Paul Duffin * 47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License. 67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at 77dd252788645e940eada959bdde927426e2531c9Paul Duffin * 87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 97dd252788645e940eada959bdde927426e2531c9Paul Duffin * 107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software 117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and 147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License. 157dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 167dd252788645e940eada959bdde927426e2531c9Paul Duffin 177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.reflect; 187dd252788645e940eada959bdde927426e2531c9Paul Duffin 197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.Beta; 207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ForwardingMap; 217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Maps; 227dd252788645e940eada959bdde927426e2531c9Paul Duffin 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Map; 247dd252788645e940eada959bdde927426e2531c9Paul Duffin 257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.Nullable; 267dd252788645e940eada959bdde927426e2531c9Paul Duffin 277dd252788645e940eada959bdde927426e2531c9Paul Duffin/** 287dd252788645e940eada959bdde927426e2531c9Paul Duffin * A mutable type-to-instance map. 297dd252788645e940eada959bdde927426e2531c9Paul Duffin * See also {@link ImmutableTypeToInstanceMap}. 307dd252788645e940eada959bdde927426e2531c9Paul Duffin * 317dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Ben Yu 327dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 13.0 337dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 347dd252788645e940eada959bdde927426e2531c9Paul Duffin@Beta 357dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic final class MutableTypeToInstanceMap<B> extends ForwardingMap<TypeToken<? extends B>, B> 367dd252788645e940eada959bdde927426e2531c9Paul Duffin implements TypeToInstanceMap<B> { 377dd252788645e940eada959bdde927426e2531c9Paul Duffin 387dd252788645e940eada959bdde927426e2531c9Paul Duffin private final Map<TypeToken<? extends B>, B> backingMap = Maps.newHashMap(); 397dd252788645e940eada959bdde927426e2531c9Paul Duffin 407dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 417dd252788645e940eada959bdde927426e2531c9Paul Duffin public <T extends B> T getInstance(Class<T> type) { 427dd252788645e940eada959bdde927426e2531c9Paul Duffin return trustedGet(TypeToken.of(type)); 437dd252788645e940eada959bdde927426e2531c9Paul Duffin } 447dd252788645e940eada959bdde927426e2531c9Paul Duffin 457dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 467dd252788645e940eada959bdde927426e2531c9Paul Duffin public <T extends B> T putInstance(Class<T> type, @Nullable T value) { 477dd252788645e940eada959bdde927426e2531c9Paul Duffin return trustedPut(TypeToken.of(type), value); 487dd252788645e940eada959bdde927426e2531c9Paul Duffin } 497dd252788645e940eada959bdde927426e2531c9Paul Duffin 507dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 517dd252788645e940eada959bdde927426e2531c9Paul Duffin public <T extends B> T getInstance(TypeToken<T> type) { 527dd252788645e940eada959bdde927426e2531c9Paul Duffin return trustedGet(type.rejectTypeVariables()); 537dd252788645e940eada959bdde927426e2531c9Paul Duffin } 547dd252788645e940eada959bdde927426e2531c9Paul Duffin 557dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 567dd252788645e940eada959bdde927426e2531c9Paul Duffin public <T extends B> T putInstance(TypeToken<T> type, @Nullable T value) { 577dd252788645e940eada959bdde927426e2531c9Paul Duffin return trustedPut(type.rejectTypeVariables(), value); 587dd252788645e940eada959bdde927426e2531c9Paul Duffin } 597dd252788645e940eada959bdde927426e2531c9Paul Duffin 607dd252788645e940eada959bdde927426e2531c9Paul Duffin /** Not supported. Use {@link #putInstance} instead. */ 617dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 627dd252788645e940eada959bdde927426e2531c9Paul Duffin public B put(TypeToken<? extends B> key, B value) { 637dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new UnsupportedOperationException("Please use putInstance() instead."); 647dd252788645e940eada959bdde927426e2531c9Paul Duffin } 657dd252788645e940eada959bdde927426e2531c9Paul Duffin 667dd252788645e940eada959bdde927426e2531c9Paul Duffin /** Not supported. Use {@link #putInstance} instead. */ 677dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 687dd252788645e940eada959bdde927426e2531c9Paul Duffin public void putAll(Map<? extends TypeToken<? extends B>, ? extends B> map) { 697dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new UnsupportedOperationException("Please use putInstance() instead."); 707dd252788645e940eada959bdde927426e2531c9Paul Duffin } 717dd252788645e940eada959bdde927426e2531c9Paul Duffin 727dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 737dd252788645e940eada959bdde927426e2531c9Paul Duffin protected Map<TypeToken<? extends B>, B> delegate() { 747dd252788645e940eada959bdde927426e2531c9Paul Duffin return backingMap; 757dd252788645e940eada959bdde927426e2531c9Paul Duffin } 767dd252788645e940eada959bdde927426e2531c9Paul Duffin 777dd252788645e940eada959bdde927426e2531c9Paul Duffin @SuppressWarnings("unchecked") 787dd252788645e940eada959bdde927426e2531c9Paul Duffin // value could not get in if not a T 797dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 807dd252788645e940eada959bdde927426e2531c9Paul Duffin private <T extends B> T trustedPut(TypeToken<T> type, @Nullable T value) { 817dd252788645e940eada959bdde927426e2531c9Paul Duffin return (T) backingMap.put(type, value); 827dd252788645e940eada959bdde927426e2531c9Paul Duffin } 837dd252788645e940eada959bdde927426e2531c9Paul Duffin 847dd252788645e940eada959bdde927426e2531c9Paul Duffin @SuppressWarnings("unchecked") 857dd252788645e940eada959bdde927426e2531c9Paul Duffin // value could not get in if not a T 867dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 877dd252788645e940eada959bdde927426e2531c9Paul Duffin private <T extends B> T trustedGet(TypeToken<T> type) { 887dd252788645e940eada959bdde927426e2531c9Paul Duffin return (T) backingMap.get(type); 897dd252788645e940eada959bdde927426e2531c9Paul Duffin } 907dd252788645e940eada959bdde927426e2531c9Paul Duffin} 91