作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我问了question关于之间的差异
public static <T> void work(Class<T> type, T instance);
和
public static <T, S extends T> void work(Class<T> type, S instance);
我想我应该解释一下我到底想知道什么。我认为这次更新原来的问题不合适,所以我在这里问另一个问题。
比如说,我想创建一个反射方法来调用 Marshaller 中定义的那些 marshal
方法。比如
void marshal(Object element, ContentHandler handler)
void marshal(Object element, File output)
void marshal(Object element, Node node)
等等。
我正在研究的方法之一是
void marshal(Object jaxbElement, Class<?> targetType, Object target)
实现很简单
marshal(Ljava/lang/Object;Ljava/lang/Class;)V
的方法,其中包含 Object.class
和 targetType
element
和 target
调用该方法。因此任何单元测试代码都可以调用
marshal(element, ContentHandler.class, handler);
marshal(element, File.class, new File("text.xml"));
在这种情况下,我应该如何定义 marshal
方法?有什么区别吗
<T> marshal(Object element, Class<T> targetType, T target);
和
<T, S extends T> marshal(Object element, Class<T> targetType, S target)
?
每个答案的进一步评论
我认为我需要 targetType
来快速而直接地寻找正确的方法。
如果没有targetType
,我必须迭代所有方法,例如
for (Method method : Marshaller.class.getMethods()) {
// check modifiers, name, return type, and so on.
if (!method.getParameterTypes()[1].isAssignableFrom(target.getClass())) {
}
}
我认为为此添加另一个版本会更好。 :)
最佳答案
很难知道为什么你想要类对象,因为如果你有 T
的实例您可以在方法中执行此操作:
Class<T> targetType = target.getClass(); // class may be derived from the instance
但是,如果您确实需要通过一门类(class),我认为您需要这样:
<T> void marshal(Object element, Class<? super T> targetType, T target) {
}
通过使用 Class<? super T>
您可以灵活地传递作为实例父类(super class)的类,而无需额外的泛型方法参数。
关于java - 用于反射的泛型类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942068/
我是一名优秀的程序员,十分优秀!