gpt4 book ai didi

java - 用于反射的泛型类型声明

转载 作者:行者123 更新时间:2023-12-01 23:41:08 25 4
gpt4 key购买 nike

我问了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)

实现很简单

  1. 查找一个类似于 marshal(Ljava/lang/Object;Ljava/lang/Class;)V 的方法,其中包含 Object.classtargetType
  2. 使用 elementtarget 调用该方法。

因此任何单元测试代码都可以调用

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/

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