小编wat*_*erg的帖子

关于java:从`String.class`得到`String [] .class`,如果`String.class`是"运行时类型"怎么办?

这是一个变量Class<?> cls,现在我想得到另一个Array Class Object组件类型cls.

例如,如果cls= String.class,我想得到String[].class; if cls= int.class,我想知道int[].class,我该怎么办?

你看,这是很容易得到String.class来自String[].class:

Class<?> arrayCls = String[].class;
if(arrayCls.isArray()){
    Class<?> cls = arrayCls.getComponentType();
}
Run Code Online (Sandbox Code Playgroud)

但我找不到简单的方法来做相反的事情.

这是一个可能的解决方案:

Class<?> clazz = String.class;
Class<?> arrayClass = Array.newInstance(clazz,0).getClass();
Run Code Online (Sandbox Code Playgroud)

请问有什么打击方法吗?

java arrays reflection runtime class

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

list.toArray(T [] a),如果"T"是"运行时类型"怎么办?

list.toArray(T[] a),如果T是"运行时类型"怎么办?

" List"接口在Java中,方法:T[] toArray(T[] a)
好的,这是一个很老的问题,通常我们这样使用它:

String[] array = list.toArray(new String[0]);
String[] array = list.toArray(new String[list.size()]);
Run Code Online (Sandbox Code Playgroud)

我的问题是,我不知道编码时类型"T"是什么,类型"T"只能在运行时决定,这里是示例:

List list=...;  // no generic type declared on this List
Class<?> clazz=...; //yeah, this is the real type of the element of the list, I can sure about that
Run Code Online (Sandbox Code Playgroud)

现在我需要将列表转换为元素类型为clazz的数组,我该怎么办?

可能你想知道为什么我有这种需要:
我对Morphia进行了一些修改(这是一个java-mongoDB框架).我需要从mongoDB获取数据并将其设置为POJO的右侧字段.在某些情况下,字段类型是数组,所获取的数据是BasicDBList实体(它扩展了ArrayList),因此BasicDBList实体必须转换为类型与POJO字段兼容的数组.

我查看了ArrayList的源代码,然后用一些丑陋的代码实现了我的目标:

List list=...;
Class<?> clazz=...;
Object targetArray=Array.newInstance(clazz, list.size());
list.toArray((Object[])targetArray);
Run Code Online (Sandbox Code Playgroud)

请问有更好的方法吗?

java generics list toarray

5
推荐指数
2
解决办法
636
查看次数

java中是否存在线程安全且元素唯一的队列?

就像"ConcurrentHashMap"和"ConcurrentLinkedQueue"的混合体.

这是我的要求:
我需要一个异步更新的缓存系统.这意味着我在将每个实体设置为memcache之前将其包装起来.warpper中有一个时间戳,指示其内容何时到期.来自前端的每个请求都将从memcache获取数据,如果warpper显示过期,则会生成更新事件并将其放入concurrentLinkedQueue,然后等待异步更新.
问题是:我不想徒劳地更新一个实体.在将事件添加到队列之前,我希望找到一种方法来确保队列中的同一实体没有事件.

如果我以这些方式这样做,那可以吗?

1,创建一个warpper类,它包含一个hashMap和一个linkedList.它的所有方法都是同步的:

public synchronized boolean add(String key,Object value){
    if(hashMap.containsKey(key)){
        return false;
    }else{
        hashMap.put(key,value);
        return linkedList.offer(value);
    }
}  
Run Code Online (Sandbox Code Playgroud)

我相信这个解决方案会非常慢.
也许它就像Collections.synchronizedMap(new LinkedHashMap()).

2,只需使用concurrentHashMap即可.如果我需要"poll"动作,则从中迭代一个元素.

public Object poll(){
    Collection valueColl = concurrentHashMap.values();
    if(valueColl.isEmpty()){
        retrun null;
    }
    return valueColl.get(0);
}  
Run Code Online (Sandbox Code Playgroud)

行动concurrentHashMap.values().get(0)缓慢与否?

3,查看"ConcurrentHashMap"和"ConcurrentLinkedQueue"的源代码,如果可能的话写一个"ConcurrentUniqueLinkedQueue".
这对我来说现在看起来有点困难.

所以,你们怎么说?

java concurrenthashmap

4
推荐指数
1
解决办法
2205
查看次数