0

我问了一个关于两者之间差异的问题

public static <T> void work(Class<T> type, T instance);

public static <T, S extends T> void work(Class<T> type, S instance);

我想我应该解释一下我到底想知道什么。我认为这次更新原始问题不合适,所以我在这里问另一个问题。

说,我想创建一个反射方法来调用Marshallermarshal中定义的那些方法,例如

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;)VObject.classtargetType
  2. 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())) {
    }
}

我认为为此添加另一个版本会更好。:)

4

3 回答 3

1

如果您在 T 处分配类,则不需要在参数中提供它,这样<T, S extends T> marshal(Object element, S target)就足够了。不过既然如此S extends TS就可以认定为T

除非您特别需要仅在类中的方法,否则您S可以省略它并编写

<T> marshal(Object element, T target)

但是,由于您正在创建一个泛型方法,您可能不需要声明 S。原因如下:

  • 如果 S 的方法与 T 不同,那么就没有好的方法来确定 S 的几个不同类的方法。除非它们有一个公共接口,但那不如使用公共接口作为T.

  • 如果 S 的方法没有区别,则没有理由专门将其指示为通用操作数。

于 2013-07-30T08:42:07.443 回答
1

很难知道你为什么想要类对象,因为如果你有一个实例,T你可以在方法中这样做:

Class<T> targetType = target.getClass(); // class may be derived from the instance    

但是,如果你真的需要通过一门课,我想你想要这个:

<T> void marshal(Object element, Class<? super T> targetType, T target) {

}

通过使用Class<? super T>,您可以灵活地传递作为实例的超类的 Class,而无需额外的泛型方法参数。

于 2013-07-30T08:48:00.330 回答
1

哪些论据集没有区别

<T> marshal(Object element, Class<T> targetType, T target);

<T, S extends T> marshal(Object element, Class<T> targetType, S target)

可以接受。

因此,如果您正在编写 API,您应该更喜欢更简单的 API,即类型参数较少的 API,即没有S.

于 2013-07-31T00:22:24.847 回答