【发布时间】:2019-05-20 14:12:26
【问题描述】:
假设我有一个由各种类实现的通用接口。
public interface MyInterface<K, V> {
// Some method declarations
// ...
// But owing to Java type erasure, we also have...
Class<K> getKClass();
Class<V> getVClass();
}
现在,我使用对象存储来获取实现MyInterface 的类的具体实例。而且我在编写代码时不知道参数K 和V 的类型。但是,可以访问预先存储的相应Class 对象。现在我可以在请求工厂时使用它们。
public MyInterface getObjectFromStore(String uniqueKey,
Class kClazz, Class vClazz) {
MyInterface concreteInstance = MyClassWarehouse.retrieveObject(uniqueKey);
// Perform type checks.
boolean kMismatch = !kClazz.isAssignableFrom(concreteInstance.getKClass());
boolean vMismatch = ...;
// Mismatch handling...
...
// Everything's okay
return concreteInstance;
}
在我看来,如果我可以将我的方法写成这样,代码看起来会更简洁:
public <K, V> MyInterface<K, V> getObjectFromStore(String uniqueKey) {
try {
MyInterface<K, V> concreteInstance = MyClassWarehouse.retrieveObject(uniqueKey);
return concreteInstance;
} catch (ClassCastException cce) {
// Better way to handle type mismatch
...
}
}
但这要求我在编写代码时知道类。
MyInterface<String, Double> retrievedObject = getObjectFromStore("key123");
由于我只有类对象,我必须使用第一种“笨拙”的方法。特别是:
// Must use this...
MyInterface retrievedObject = getObjectFromStore("key123", kClazz, vClazz);
// ... because this (or anything equivalent) is not possible.
MyInterface<kClazz, vClazz> retrievedObject = getObjectFromStore("key123");
在我看来,由于 Java 中的类型不是真正的对象,因此无法以启用第二种方法的方式从类对象 kClazz 和 vClazz 中获取类型标记 K 和 V .但是,语法糖会很好。
是否还有其他原因无法启用此功能?
【问题讨论】:
-
在这一行 MyInterface
concreteInstance = MyClassWarehouse.retrieveObject(uniqueKey); retriveObject 方法是否返回一个由 MyInterface 分别使用您的类型标记实现的对象? -
应该的。
MyClassWarehouse专用于存储实现MyInterface的(各种)类的对象。但是,在检索对象时,我想确保类型一致性。 -
笨拙的代码也使用原始类型,这有点笨拙。
标签: java generics syntactic-sugar