Java 使用类型参数作为方法输入

Java 使用类型参数作为方法输入,java,generics,Java,Generics,我在将类型参数从一个方法发送到另一个方法时遇到问题。 最好用代码来说明 import javax.ws.rs.core.GenericType; public class Test { public static void main(String[] args) throws IllegalAccessException, InstantiationException { new Test().a(() -> "ABC"); new Test().

我在将类型参数从一个方法发送到另一个方法时遇到问题。 最好用代码来说明

import javax.ws.rs.core.GenericType;
public class Test {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        new Test().a(() -> "ABC");
        new Test().a(() -> 42);
        new Test().a(() -> Boolean.TRUE);
    }

    public <T, E extends Exception> T a(UpdateFunction<T, E> function) throws InstantiationException, IllegalAccessException, E {
        Data<T,E> data = b(new GenericType<T>(){}, new GenericType<E>(){});
        data.data = function.update();
        //TBI: save and process data here
        return data.data;
    }

    public <T, E extends Exception> Data<T, E> b(GenericType<T> type, GenericType<E> exception) throws IllegalAccessException, InstantiationException {
        return new Data<T, E>(); //In the real life scenario this takes a lot of code
    }

    public class Data <T, E extends Exception> {
        T data;
    }

    @FunctionalInterface
    public interface UpdateFunction <T, E extends Exception>{
        T update() throws E;
    }
}

可能根本不应该使用
GenericType
,但是我不知道怎么做

您考虑过将类型参数移动到类级别吗

这样,您就不必“将类型参数从一个方法发送到另一个方法”

类测试{
公共静态void main(字符串[]args){
新测试().a(()->“ABC”);
}
public void a(UpdateFunction函数){
b();
}
公共数据b(){
返回新数据();
}
公共类数据{//数据类可以访问T和E
E;
T;
}
@功能接口
公共接口更新函数{
T更新()抛出E;
}
}

我已经考虑过了,但是在现实生活中,我必须对同一个实例使用不同的类型参数,所以它不起作用。我得到的最接近的结果是将update函数向下发送到b,但它感觉像是一个肮脏的黑客程序,您不能将
GenericType
之类的东西与类型变量一起使用。只有使用混凝土类型时,它才有效。也就是说,我看不出有什么理由首先需要它们,因为您正在丢弃
b
的结果,您可以调用
b()
,然后就完成了。i、 这个例子太过矫揉造作,无法说明这个问题。是的,我认为用GenericType是不可能的。还更新了代码,以便更容易理解我为什么要这样做。您是否尝试过使用类对象?@bracco23我尝试过,但我现在不知道如何从泛型参数实例化类。这仍然没有说明问题。类型参数已“向下传递”,但未传递
GenericType
s。但既然您抛出了一个
实例化异常
,我想您是在做类似
Class.forName(type.getType()).newInstance()的事情?在Java8中,有许多更干净的方法来进行实例化。但无论如何,您必须从调用站点传递实际捕获类型信息的附加参数,因为泛型类型会被擦除。
IllegalArgumentException: javax.ws.rs.core.GenericType<T> does not specify the type parameter T of GenericType<T>
class Test<T, E extends Exception> {

    public static void main(String[] args) {
        new Test().a(() -> "ABC");
    }

    public void a(UpdateFunction<T, E> function) {
        b();
    }

    public Data b() {
        return new Data();
    }

    public class Data { // Data class has access to T and E
        E e;
        T t;
    }

    @FunctionalInterface
    public interface UpdateFunction <T, E extends Exception>{
        T update() throws E;
    }
}