2015-10-16 42 views
0

我想使用番石榴的集合來創建一個地圖,它將存儲一個類實例作爲鍵和一個整數作爲值。因此,像這樣:番石榴地圖存儲類實例作爲鍵和int值

鍵 - 值

FooOne - 1 
FooTwo - 2 
FooThree - 3 
FooFour - 4 

我現在在代碼中有這樣的:

private ClassToInstanceMap<Object> classRanking = MutableClassToInstanceMap.create(); 
classRanking.put(FooOne.class, 0); 
classRanking.put(FooTwo.class, 1); 
classRanking.put(FooThree.class, 2); 
classRanking.put(FooFour.class, 3); 

但運行時拋出一個錯誤:

java.lang.ClassCastException: Cannot cast java.lang.Integer to com.jer.abc.test.FooOne 
    at java.lang.Class.cast(Unknown Source) 
    at com.google.common.collect.MutableClassToInstanceMap.cast(MutableClassToInstanceMap.java:82) 
    at com.google.common.collect.MutableClassToInstanceMap.access$000(MutableClassToInstanceMap.java:36) 
    at com.google.common.collect.MutableClassToInstanceMap$1.checkKeyValue(MutableClassToInstanceMap.java:67) 
    at com.google.common.collect.MutableClassToInstanceMap$1.checkKeyValue(MutableClassToInstanceMap.java:64) 
    at com.google.common.collect.MapConstraints$ConstrainedMap.put(MapConstraints.java:313) 
    at com.fmr.gps.web.support.PortfolioInsightsSupport.populateRankingMap(PortfolioInsightsSupport.java:33) 
    at com.fmr.gps.web.support.PortfolioInsightsSupport.<init>(PortfolioInsightsSupport.java:29) 
    at com.fmr.gps.web.PortfolioInsightsSupportTest.setUp(PortfolioInsightsSupportTest.java:38) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

所以我想使用普通的老式java地圖,但this thread告訴我做其他事情。那麼有關如何解決這個問題的任何想法?

回答

7

ClassToInstanceMap適用於當您想要執行諸如classRanking.put(FooOne.class, new FooOne())之類的內容時,即這些值將是密鑰的實例。但0不是FooOne的實例,它只是一個Integer。你只是想要一個正常的Map<Class<?>, Integer>,所以使用HashMap什麼的。