Java 反射的泛型类型声明
我问了一个关于两者之间的区别的问题Java 反射的泛型类型声明,java,generics,reflection,Java,Generics,Reflection,我问了一个关于两者之间的区别的问题 public static <T> void work(Class<T> type, T instance); 等等 我正在研究的一种方法是 void封送处理(对象jaxbElement、类targetType、对象target) 实现很简单 使用Object.Class和targetType查找类似于marshall(Ljava/lang/Object;Ljava/lang/Class;)的方法 使用元素和目标调用该方法 所以任何
public static <T> void work(Class<T> type, T instance);
等等
我正在研究的一种方法是
void封送处理(对象jaxbElement、类targetType、对象target)
实现很简单
Object.Class
和targetType
查找类似于marshall(Ljava/lang/Object;Ljava/lang/Class;)的方法
元素
和目标
调用该方法marshal(元素,ContentHandler.class,handler);
封送处理(元素,File.class,新文件(“text.xml”);
在这种情况下,我应该如何定义封送
方法?两者之间有什么区别吗
marshal(对象元素,类targetType,T目标);
及
marshal(对象元素,类targetType,S目标)
?
每个答案的进一步评论
我想我需要targetType
来快速直接地寻找正确的方法
没有targetType
我必须迭代所有方法,如
for (Method method : Marshaller.class.getMethods()) {
// check modifiers, name, return type, and so on.
if (!method.getParameterTypes()[1].isAssignableFrom(target.getClass())) {
}
}
我认为,为此添加另一个版本会更好。:) 如果在T处分配类,则不需要在参数中提供它,因此
封送(Object元素,S target)
就足够了。但是由于S扩展了T
,S
可以被识别为T
除非您特别需要只在类S
中的方法,否则您可以省略它并编写
<T> marshal(Object element, T target)
marshal(对象元素,T目标)
但是,由于您正在创建泛型方法,因此可能不需要声明S。这是因为以下原因:
- 如果S的方法不同于T,那么没有好的方法来确定几个不同类S的方法。除非它们有一个公共接口,但是您也可以使用公共接口作为
T
- 如果S的方法没有差异,则没有理由将其指定为泛型操作数
封送(Object-element,S-target)
就足够了。但是由于S扩展了T
,S
可以被识别为T
除非您特别需要只在类S
中的方法,否则您可以省略它并编写
<T> marshal(Object element, T target)
marshal(对象元素,T目标)
但是,由于您正在创建泛型方法,因此可能不需要声明S。这是因为以下原因:
- 如果S的方法不同于T,那么没有好的方法来确定几个不同类S的方法。除非它们有一个公共接口,但是您也可以使用公共接口作为
T
- 如果S的方法没有差异,则没有理由将其指定为泛型操作数
T
的实例,您可以通过以下方法执行此操作:
Class<T> targetType = target.getClass(); // class may be derived from the instance
Class targetType=target.getClass();//类可以从实例派生
但是,如果你真的需要通过一门课,我想你需要这样:
<T> void marshal(Object element, Class<? super T> targetType, T target) {
}
void marshal(Object元素,Class很难知道为什么需要Class对象,因为如果有T
的实例,可以在方法中执行此操作:
Class<T> targetType = target.getClass(); // class may be derived from the instance
Class targetType=target.getClass();//类可以从实例派生
但是,如果你真的需要通过一门课,我想你需要这样:
<T> void marshal(Object element, Class<? super T> targetType, T target) {
}
void封送处理(Object元素,Class所使用的参数集没有区别
marshal(对象元素,类targetType,T目标);
及
marshal(对象元素,类targetType,S目标)
我可以接受
因此,如果您正在编写一个API,您应该更喜欢简单的API,即具有较少类型参数的API,即没有S的API
marshal(对象元素,类targetType,T目标);
及
marshal(对象元素,类targetType,S目标)
我可以接受
因此,如果您正在编写一个API,您应该更喜欢更简单的API,即类型参数更少的API,即没有S
的API,但是您不知道S
中有哪些方法!您不可能需要in。但是您不知道S
中有哪些方法!您不可能需要in。Bec因为只有target.getClass()
我想我必须检查所有那些marshal
方法的第二个参数的可比性,对吧?哇,我不会做,因为只有target.getClass()
我想我必须检查所有那些封送
方法的第二个参数的可比性,对吗?哇,我不会这么做