gpt4 book ai didi

java - 在集合上适当使用 Java 泛型

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:13 25 4
gpt4 key购买 nike

我以前从来没有机会接触过泛型(比如编写泛型类),但现在需要了,我遇到了一些困惑。

有这个接口(interface),它是东西的包装器。这些实现不是集合,因此每个实例只能访问一个东西

public interface Resource<T> {
// Expected operations:
void write(ResourceState state);
ResourceState read();
}

作为实现,我希望有一个 ExclusiveResource<T> , 和一个 ShareableResource<T> ,主要/仅在使用的锁定方案(分别为常规锁定和读写锁定)上有所不同。
至于如何readwrite已执行,我打算使用Strategy 模式。
例如,我可能有

// This would implement a Strategy<File>.
FileStrategy fs = new FileStrategy();
Resource<File> r = new ExclusiveResource<File>(fs);

现在,我还得到了这些资源的某种集合,比如资源池。
我想为资源池中的每个资源映射一个键,我想添加、检索和删除资源,但我不确定如何声明映射和方法。我尝试了以下方法:

public class ResourcePool {
// instance variables
private final Map<String, Resource<?>> map;

/** Empty constructor of objects of class ResourcePool. */
public ResourcePool() {
map = new HashMap<String, Resource<?>>();
}

/** */
public Resource<?> get(String s) {
return map.get(s);
}

/** */
public void add(String s, Resource<?> r) {
map.put(s, r);
}

// ...
}

这似乎不是最合适的方式,引用 Josh Bloch 的话,关于 Effective Java Reloaded :

User should not have to think about wildcards to use your API.

我用下面的方法测试了这段代码:

public static void test() {
ResourcePool rp = new ResourcePool();

Resource<String> r1 = new ShareableResource<>("test");
Resource<Integer> r2 = new ShareableResource<>(1);
Resource<List<String>> r3 = new ShareableResource<>(
Arrays.asList(new String[]{"1", "2"})
);

// These are all ok.
rp.add("1", r1);
rp.add("2", r2);
rp.add("3", r3);

// This results in a compiler error (incompatible types).
Resource<String> g1 = rp.get("1");

// This results in a compiler warning (unsafe operation).
Resource<String> g2 = (Resource<String>) rp.get("1");
}

我不喜欢它,当代码编译时带有警告。让我感到内疚,似乎是在暗示编码不当。

所以,我的问题是我应该如何处理这种情况。
这是做我想做的事情的正确方法吗?
能否以没有不安全操作的方式完成?

最佳答案

我认为没有任何方法可以避免使用您的设计进行未经检查的转换。也就是说,您可以避免每次检索 Resource 时都必须进行强制转换。 :

@SuppressWarnings("unchecked")
public <T> Resource<T> get(String s, Class<T> c) {
return (Resource<T>) map.get(s);
}

当你想检索 Resource 时,你传入所需的类,像这样:

Resource<String> g1 = rp.get("1", String.class);

不过,您应该小心这种设计,因为没有运行时保证返回的 Resource实际上是一个 Resource<String> .

关于java - 在集合上适当使用 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16377348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com