gpt4 book ai didi

java - 如何避免不得不使用 @SuppressWarnings ("unchecked")?

转载 作者:行者123 更新时间:2023-12-04 06:00:28 25 4
gpt4 key购买 nike

我有一个用于将对象持久保存到磁盘的 Cache 对象,我实现它的方式导致我不得不使用 @SupressWarnings 。我不是 Java 专家,但这似乎是一种代码异味,我想知道是否有“更好”的方法来完成我在这里所做的事情(例如,在我编写缓存时以某种方式存储类型,并读取此值以能够实例化特定类型?)。

我的 Cache 对象看起来像这样(为简洁起见,删除了不相关的代码):

/**
* Write object o to cache file
*
* @param cacheName
* @param o
* Serializable object to write to cache
*/
public static void put(String cacheName, Serializable o) throws IOException {
FileOutputStream fos = new FileOutputStream(getHashedFileName(cacheName));
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(o);
fos.close();
}

/**
* Get an object from the cache. Caller should use exists() before calling
* here to make sure the cache item exists otherwise Exception will be
* thrown
*
* @param cacheName
* @return Object from cache
*/
public static Object get(String cacheName) throws CacheNotFoundException,
IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream(getHashedFileName(cacheName));
ObjectInputStream ois = new ObjectInputStream(fis);
Object o = ois.readObject();
return o;
}

因为 get() 可以返回任何类型的对象,所以当我从缓存中读取时,我现在必须将它转换回原始类型。我想知道我是否可以避免首先产生警告:
class somethingDoingSomeWork {

/**
* Save all work done to the cache.
* @throws IOException
*/
public void saveToCache() throws IOException {
Cache.put(getCacheKey(), (MyObject<String>) summary);
}

/**
* Repopulate from cache
*/
@SuppressWarnings("unchecked")
public boolean loadFromCache() throws IOException, CacheNotFoundException,
ClassNotFoundException {
// Code removed, checking for existence of cache, etc.

// Cast required here, and this row generates unchecked warning
summary = (MyObject<String>) Cache.get(getCacheKey());
return true;
}
}

编辑:对于建议搬家的人 @SuppressWarnings更接近代码,注释只能用在声明的行上,所以这对我没有帮助

使用泛型也有帮助,但它似乎将问题转移到 Cache.get()方法。最好的解决方案似乎是这样的: http://www.velocityreviews.com/forums/t499693-how-do-you-prevent-unchecked-cast-warning-when-reading-from-objectinputstream.html

最佳答案

and I'm wondering if there's a 'better' way to do what I'm doing here (for instance, somehow storing a Type when I write the cache, and reading this value to be able to instantiate a specific type?)



在这里使用泛型。如果你有
public <String, P extends Serializable> R get( String key);
public <String, P extends Serializable> void put( String key, R value);

我不是指已经存在的缓存实现。像 Guava 一样,那些无论如何都支持缓存,但我相信你想改进这段代码。

作为最后的手段,一件大事是始终使 @SupressWarnings 尽可能靠近导致它的代码。

关于java - 如何避免不得不使用 @SuppressWarnings ("unchecked")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8971954/

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