3

我正在尝试制作如下所示的单身人士,但我不断收到警告。如果可能的话,我不想抑制警告。有没有办法做到这一点?

现在,我不想考虑线程安全。我只是想通过这个警告。

    public interface Storage<K, V> {
        public void put(K key, V value);
        public V get(K key);
    }


    public static class DefaultStorage<K, V> implements Storage<K, V> {

        private Map<Object, Object> map = new ConcurrentHashMap<Object, Object>();

        private static DefaultStorage<K, V> defaultStorage;

        private DefaultStorage() {
            //
        }

        public static DefaultStorage<?, ?> getInstance() {
            if (defaultStorage== null) {
                defaultStorage= new DefaultStorage();
            }
            return defaultStorage;
        }
     }

谢谢。

4

3 回答 3

2

变量defaultStoragein在组合DefaultStorage的每个实例中仅存在一次DefaultStorage。在运行时只有一个实际类和一个静态变量。因此,变量将同时为 a DefaultStorage<K1, V1>、 a DefaultStorage<K2, V2>、 aDefaultStorage<K3, V3>等。因此,一个类将存储Strings在其中,另一个将存储BigDecimals,另一个将存储X501Principals。这颠覆了类型安全。

警告是您将原始类型的实例存储new DefaultStorage()在声明为的变量中DefaultStorage<K, V>

来自Angelika Langer 的泛型常见问题解答

泛型类型可以有静态成员吗​​?

是的。

泛型类型可以有静态成员,包括静态字段、静态方法和静态嵌套类型。这些静态成员中的每一个在每个封闭类型中都存在一次,也就是说,与封闭类型的对象数量无关,也与可能在程序中某处使用的泛型类型的实例数量无关。静态成员的名称由范围(包和封闭类型)和成员名称组成 - 与静态成员通常一样。如果封闭类型是泛型的,则范围限定中的类型必须是原始类型,而不是参数化类型。

于 2013-06-07T04:41:01.433 回答
1

我会使用枚举并指定类型。

public interface Storage<K, V> {
    public void put(K key, V value);
    public V get(K key);
}

public enum DefaultStorage implements Storage<String, Object> {
    INSTANCE;

    private final Map<Object, Object> map = new ConcurrentHashMap<>();

    public Object get(String key) { return map.get(key); }
    public void put(String key, Object value) { map.put(key, value); }

}

于 2013-06-07T05:53:20.173 回答
0

您如何能够像这样创建对参数化内部类的引用?

private static DefaultStorage<K, V> defaultStorage;

根据泛型类中的静态方法中给出的解释?

类的类型参数仅适用于其实例变量,而不适用于静态字段和方法。静态字段和方法在类的所有实例之间共享,甚至在各种类型参数的实例之间共享。”

因此,您不能创建对类 DefaultStorage 的静态引用并将其限制为仅 K、V 类型。这应该没问题。

private static DefaultStorage<?,?> defaultStorage;

但是正如您所提到的,我无法在不压制警告的情况下摆脱警告。并像这样创建对象

默认存储=新的默认存储();
显然会引发编译错误。

于 2013-06-07T05:51:43.250 回答