Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反射的泛型类型声明_Java_Generics_Reflection - Fatal编程技术网

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的方法没有差异,则没有理由将其指定为泛型操作数


    如果在T处分配类,则不需要在参数中输入它,因此
    封送(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()
    我想我必须检查所有那些
    封送
    方法的第二个参数的可比性,对吗?哇,
    我不会这么做