相关疑难解决方法(0)

使用Class实例作为Map键是最佳实践吗?

我在某处读过如下使用类实例并不是一个好主意,因为它们可能会导致内存泄漏.有人能告诉我这是否是一个有效的陈述?或者这样使用它有什么问题吗?

Map<Class<?>,String> classToInstance = new HashMap();

classToInstance.put(String.class,"Test obj");
Run Code Online (Sandbox Code Playgroud)

java

37
推荐指数
3
解决办法
2万
查看次数

异构容器,用于在Java中存储通用类型的对象

我试图从Effective Java跟随Joshua Bloch的类型安全异构容器模式来创建一个对象容器(MyGeneric<T>)Class<T>作为键.

  public class MyClass {

    private Map<Class<?>, MyGeneric<?>> myContainer =
      new HashMap<Class<?>, MyGeneric<?>>();

    public <T> void addToContainer(Class<T> class, MyGeneric<T> thing) {
      myContainer.put(class, thing);
    }

    public <T> MyGeneric<T> getFromContainer(Class<T> class) {
      return (MyGeneric<T>)(myContainer.get(klass));
    }
  }
Run Code Online (Sandbox Code Playgroud)

问题在于getFromContainer我必须执行未经检查的强制转换.在Josh Bloch的容器中,他表演了一个安全演员 - 但就我而言,我看不出这是怎么回事.

有没有人有任何想法?

干杯,尼克.

java generics

13
推荐指数
1
解决办法
4471
查看次数

Java 8通用函数映射

不确定这是否可能; 我承认我并不像我希望的那样擅长仿制药.

基本上,我想创建一个类 - >函数的映射,其中用于键的类是函数输入的类,就像这样(不合法的语法):

public static Map<Class<T>,Function<T,Expression>> STUFF = new HashMap<>();

{
    STUFF.put(List.class, ListExpression::new);
    STUFF.put(String.class, StringExpression::new);// this constructor must take string
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

Function<String,Expression> e = STUFF.get(o.getClass());
Expression ex = e.apply(o);
Run Code Online (Sandbox Code Playgroud)

它适合我的类型.

java generics java-8

6
推荐指数
1
解决办法
3390
查看次数

Guava映射存储类实例作为键和int值

我试图用番石榴的集合来创建地图,将一个类实例存储的密钥和一个整数作为值.所以像这样:

核心价值

FooOne - 1
FooTwo - 2
FooThree - 3
FooFour - 4
Run Code Online (Sandbox Code Playgroud)

我现在在代码中有这个:

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);
Run Code Online (Sandbox Code Playgroud)

但是在运行时会抛出错误:

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) …
Run Code Online (Sandbox Code Playgroud)

java dictionary class instance guava

0
推荐指数
1
解决办法
284
查看次数

标签 统计

java ×4

generics ×2

class ×1

dictionary ×1

guava ×1

instance ×1

java-8 ×1