我想知道是否有可能创建一个“模板化”的吸气剂,例如:
class TestGet
{
private static Map<String,Object> theMap.....
public static getObject<T>(String key).....
代码中的某处,如:
JButton myButton = TestGet.getObject<JButton>("theButton");
注意:这是只是一个“闲置”的问题,我正试图避免代码中的“脏”演员,因为每次看到它们都会让我的眼睛流血。
我知道有更优雅的方法可以做到这一点,但我真的会用地图来避免与其他类链接。
我尝试了一些配置,但似乎没有任何东西适合我想要做的......这样的模板是否可能?
答案 0 :(得分:4)
你可以写
public static <T> T getObject(String key) {
return (T) theMap.get(key); // produces a warning.
}
和
JButton myButton = TestGet.<JButton>getObject("theButton");
或只是
JButton myButton = TestGet.getObject("theButton");
更复杂的例子;)
class A<T> {
class B<S> {
public <U extends S> U tsu() {
return null;
}
}
}
List<String> list = new A<Integer>().new B<List>().<List<String>>tsu();
答案 1 :(得分:1)
如果你想要做的只是隐藏演员表,那么彼得就表现得很容易。如果您还想避免使用ClassCastExceptions,请键入erasure指示您必须将类作为参数传递(您不能对泛型类型执行instanceof
)。这有点乱。
class TestGet {
private static final Map<String,Object> theMap = new HashMap<String, Object>();
@SuppressWarnings("unchecked")
public static <T> T getObject(final String key, final Class<T> clazz) {
final Object o = theMap.get(key);
return o != null && clazz.isAssignableFrom(o.getClass())
? (T) o
: null;
}
}
然后
JButton b = TestGet.getObject("theButton", JButton.class);