小编Mar*_*hke的帖子

泛型类中的嵌套泛型

我想在我的api中提供类似的东西:

class Foobar extends AbstractThing<Double>

class EventThing<Foobar> {    
            public Foobar getSource();
            public Double getValue();
}
Run Code Online (Sandbox Code Playgroud)

所以我写这个:

class EventThing<T extends AbstractThing<U>> {    
        public T getSource();
        public U getValue();
}
Run Code Online (Sandbox Code Playgroud)

但java无法解决U.

随着EventThing<T extends AbstractThing<U>,U>代替它的工作原理,但第二个U实际上是多余的"导致AbtractThing已定义的类型.所以我喜欢摆脱它.

java generics

12
推荐指数
1
解决办法
6214
查看次数

guavas Cache(移位)的复合键

我有一个点对象:

  class Point {
    final int x,y;
    ...
  }
Run Code Online (Sandbox Code Playgroud)

因为这些点将在我的代码中的所有位置使用/创建,所以我想开始使用guavas缓存.遗憾的是,CacheLoader只接受一个参数. stackoverflow的另一个问题是使用一个对象来解决类似的问题.但我不喜欢为每个缓存请求创建一个虚拟对象.所以我想出了自己的解决方法:

因为对象是由x和y指定的,所以我认为我可以将两个值合并(移位)为long,这将是我的关键.

void test(int x, int y) {
    Long key = (long) ((long) (x) << Integer.SIZE | y);
    Point point = cache.get(key);
}

CacheLoader<Long, Point> loader = new CacheLoader<Long, Point>() {
    public Point load(Long key) throws Exception {
    final int x,y;
        // shift magic
        x = (int) (key >> Integer.SIZE);
        y = key.intValue();
        return new Point(x, y);
    }
};
Run Code Online (Sandbox Code Playgroud)

我实际上是一个转移菜鸟.这会有用吗?我错过了什么?这比同类"快"吗?那是我的问题!

是的,我测试代码,到目前为止,我可以告诉它.

java caching shift guava

8
推荐指数
1
解决办法
7740
查看次数

获取Class <T> [Runtime-Type Token]的实例

我创建了一个Preferences类,对于Getters我不想使用Runtime-Type Token.

所以这是我的getter方法:

public <T> T get(String key, Class<T> clazz) {
    // do some crazy stuff (e.g. Double <-> Float)
}
Run Code Online (Sandbox Code Playgroud)

到此为止,一切正常.但我希望class参数是可选的.

boolean b = preferences.get(key);
Run Code Online (Sandbox Code Playgroud)

所以我添加了一个额外的方法:

public <T> T get(String key) {
    // return get(key, Class<T>);
}
Run Code Online (Sandbox Code Playgroud)

现在问题:有没有办法做到这一点?有没有办法获得/的实例Class<T>.

可以使用一个小的解决方法:

public <T> T get(String key, T... args) {
    return get(key, (Class<T>) args.getClass().getComponentType());
}

public <T> T get(String key, Class<T> clazz) {
    System.out.println("key  : " + key);
    System.out.println("clazz: " + clazz);
}

// using
Boolean b = get("mykey");
Run Code Online (Sandbox Code Playgroud)

java generics

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

Selector.select不会按预期阻止

在我目前的项目中,我注意到select()没有按预期阻止.即使没有IO,它也不会完全阻塞并始终返回.所以我得到了一个忙碌的CPU.

注册将始终由另一个线程调用,因此我需要锁定和唤醒.

该文件说selectNow():

调用此方法可清除以前调用wakeup方法的效果.

所以我在每次迭代结束时调用该方法.没有succsess.我没有找到任何示例或解释如何selectNow用于我的目的.

代码有什么问题?


这是我的示例代码,因此您可以测试它.

BTW:另一个stackoverflow问题是我的代码的角色模型.编辑:示例修复!它现在有效.

import java.io.IOException;
import java.net.*;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.concurrent.locks.ReentrantLock;

public class Test implements Runnable {
    ReentrantLock selectorLock = new ReentrantLock();
    Selector selector;
    boolean alive;

    @Override
    public void run() {
        SelectionKey key;
        Iterator<SelectionKey> keys;

        alive = true;
        try {
            while (alive) {
                selectorLock.lock();
                selectorLock.unlock();

                selector.select();
                System.out.println("select() returned");

                keys = selector.selectedKeys().iterator();
                // handle each "event"
                while (keys.hasNext()) {
                    key = keys.next();
                    // mark as handled
                    keys.remove();
                    // …
Run Code Online (Sandbox Code Playgroud)

java multithreading nio locking

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

GWT序列化TreeMap的排序/比较器

我有一个带有TreeMap的可序列化对象.

Map<String, Dogs> dogsByNames = Maps.newTreeMap(); // guava style
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好.现在忽略键的情况是必要的:

Map<String, Dogs> dogsByNames = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为String.CASE_INSENSITIVE_ORDER不是serialzable:

com.google.gwt.user.client.rpc.SerializationException:类型'java.lang.String $ CaseInsensitiveComparator'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象.出于安全考虑,此类型不会被序列化:instance = java.lang.String$CaseInsensitiveComparator@f26f68

所以我创建了自己的一个:

private static abstract class MyComparator<T>
    implements
        Comparator<T>, // extends Ordering<T> do not work
        IsSerializable { // Serializable do not work
}

public static final MyComparator<String> CASE_INSENSITIVE_ORDER = new MyComparator<String>() {
    @Override
    public int compare(final String left, final String right) {
        if (null == left) {
            return (null == right) ? 0 : -1;
        } else if (null == …
Run Code Online (Sandbox Code Playgroud)

java gwt serialization treemap guava

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

JList:上一个选定的项目

我有一个JList并注册一个选择处理程序(ListSelectionListener).现在我需要现在以前选择的项目/索引.

到目前为止,我自己保存了最后一个选定的项目.有没有更好的方法呢?换句话说:这些年来我是否有错过的方法/最佳实践?!

java swing jlist selectionchanged

3
推荐指数
1
解决办法
3329
查看次数

EnumMap引发NullPointerException

我有一个Enum和一个EnumMap<Parameters, Byte>.

我将地图放入一个类中以隐藏"字节"值.所以我有一个set(Parameter, int)set(Parameter, boolean)方法.

public enum Parameter {
    BLAH
}


public class Parameters {
    private final Map<Parameter, Byte> parameters = new EnumMap<>(Parameter.class);

    public byte set(Parameter parameter, boolean set) {
        return this.parameters.put(parameter, (byte) (set ? 0x01 : 0x00));
    }

    public byte set(Parameter parameter, int value) {
        return this.parameters.put(parameter, (byte) value);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话给任何一种方法时,NPW会提出哪一点put!如果我parameters公开并且直接调用方法它就可以了.

final Parameters parameters = new Parameters();
//parameters.parameters.put(Parameter.BLAH, (byte) 0x00);
parameters.set(Parameter.BLAH, false); // NPE
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释这是对我的行为吗?

java nullpointerexception enum-map

2
推荐指数
1
解决办法
867
查看次数