如何选择在Java中的泛型类内调用哪个具体实例方法

如何选择在Java中的泛型类内调用哪个具体实例方法,java,generics,java-8,Java,Generics,Java 8,我有一个泛型类,它不知道它的具体类型: public class TheGeneric<T> { public TheGeneric(T t) { int return = t.callConcreteMethod(); // Do something ... } } 属性a与属性b不同 现在我想选择这两种实例方法中的哪一种来代替callConcreteMethod 据我所知,一个带有get方法的接口(具体类可以实现)是不够的。接口必

我有一个泛型类,它不知道它的具体类型:

public class TheGeneric<T> {
    public TheGeneric(T t) {
        int return = t.callConcreteMethod();
        // Do something ...
    }
}
属性a与属性b不同

现在我想选择这两种实例方法中的哪一种来代替callConcreteMethod

据我所知,一个带有get方法的接口(具体类可以实现)是不够的。接口必须实现这些方法的数量可变

在Java8中,我认为解决方案可以是使用新的函数接口供应商或消费者让泛型类知道它必须选择/调用哪个具体实例方法。因此,实例化调用可能如下所示:

TheConcrete concrete = new Concrete(1, 2);
TheGeneric<TheConcrete> generic = new TheGeneric<>(concrete, TheConcrete::getB);
static final ToIntFunction<TheConcrete> GET_A=TheConcrete::getA;
static final ToIntFunction<TheConcrete> GET_B=TheConcrete::getB;
如果这真的是可能的,我不知道如何完成这个方法来获得具体方法的返回类型

是否存在其他方法和/或设计模式来实现此想法


重要的约束是,不同的实例方法是同一类的一部分,它们中的每一个都应该是可选的,以便在泛型类中仅通过一步调用进行调用。

您可以使用策略模式。您可以传递Strategy对象来代替参数Concrete::getB,该对象将调用Concrete类的getB或getWhicheverMethod,然后返回值或执行其他任务

该策略对象可以通过混凝土的静态工厂方法检索,该方法可以是公共接口的一部分,但这取决于您的需要


查看Wiki,它很好地描述了它

您可以使用策略模式。您可以传递Strategy对象来代替参数Concrete::getB,该对象将调用Concrete类的getB或getWhicheverMethod,然后返回值或执行其他任务

该策略对象可以通过混凝土的静态工厂方法检索,该方法可以是公共接口的一部分,但这取决于您的需要


查看Wiki,它很好地描述了它

您很接近解决方案,但供应商和消费者都不适合这里。您需要一个使用实例并返回属性值的函数接口。由于属性的类型为int,因此ToIntFunction或Function是合适的

泛型的代码可能如下所示:

public class TheGeneric<T> {
    public TheGeneric(T t, ToIntFunction<T> method) {
        int value=method.applyAsInt(t);
        // Do something ...
    }
}
然后您可以像这样使用它:

TheConcrete concrete = new TheConcrete(1, 2);
TheGeneric<TheConcrete> generic = new TheGeneric<>(concrete, TheConcrete.GET_B);
请注意,ToIntFunction是一个Java8接口,但是如果您创建自己的名为ToIntFunction的接口,并使用单个方法int applyAsIntT值,那么整个接口就可以正常工作

如果要支持任意类型的属性,则泛型类需要另一个类型参数:

public class TheGeneric<T,V> {
    public TheGeneric(T t, Function<T,V> method) {
        V value=method.apply(t);
        // Do something ...
    }
}

我认为其余部分的调整是直接进行的。

您接近解决方案,但供应商和消费者都不适合。您需要一个使用实例并返回属性值的函数接口。由于属性的类型为int,因此ToIntFunction或Function是合适的

泛型的代码可能如下所示:

public class TheGeneric<T> {
    public TheGeneric(T t, ToIntFunction<T> method) {
        int value=method.applyAsInt(t);
        // Do something ...
    }
}
然后您可以像这样使用它:

TheConcrete concrete = new TheConcrete(1, 2);
TheGeneric<TheConcrete> generic = new TheGeneric<>(concrete, TheConcrete.GET_B);
请注意,ToIntFunction是一个Java8接口,但是如果您创建自己的名为ToIntFunction的接口,并使用单个方法int applyAsIntT值,那么整个接口就可以正常工作

如果要支持任意类型的属性,则泛型类需要另一个类型参数:

public class TheGeneric<T,V> {
    public TheGeneric(T t, Function<T,V> method) {
        V value=method.apply(t);
        // Do something ...
    }
}
我认为其他人的适应是直截了当的