我想创建一个方法,有不同的行为,基于输入类型.基本上是方法重载. 我在另一个泛型类中使用该方法.方法重载将回退到泛型的基础上.在这种情况下,有没有办法让它使用最终的泛型类String,而不是退回到Object类型.

有没有比方法重载更好的模式,根据泛型的最终类型拥有不同的行为?

class GenericOverwrite {
    public static void foo(String bar){
        System.out.println("string");
    }

    public static void foo(Object bar){
        System.out.println("object");
    }
}

class Foo <T extends Object> {
    public void basedOnGeneric(T bar){
        GenericOverwrite.foo(bar);
    }
}

class Test{
    void test(){
        var a = new Foo<String>();
        a.basedOnGeneric("I wish this could print string, but uses the object overloaded method");

        var b = new Foo<Object>();
        b.basedOnGeneric("This should print object");
    }
}

推荐答案

您可以通过将方法传递给构造函数来解决此问题:

class Foo <T extends Object> {
    private final Consumer<T> cons;

    Foo(Consumer<T> cons) {
        this.cons = cons;
    }

    public void basedOnGeneric(T bar){
        cons.accept(bar);
    }
}

public class Test{
    public static void main(String[] args){
        Foo<String> a = new Foo<String>(GenericOverwrite::foo);
        a.basedOnGeneric("I wish this could print string, but uses the object overloaded method");

        Foo<Object> b = new Foo<Object>(GenericOverwrite::foo);
        b.basedOnGeneric("This should print object");
    }
}

Java相关问答推荐

为什么我的画布没有显示在PFA应用程序中?

将linkedHashMap扩展到Java中的POJO类

Springdoc Whitelabel Error Page with Spring V3

在现代操作系统/硬件上按块访问数据值得吗?

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

取消按钮,但没有任何操作方法引发和异常

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

Junit with Mockito for java

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

扩展到弹出窗口宽度的JavaFX文本字段

一对多关系和ID生成

通过Java列表中的某些字段搜索值

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

记录是类的语法糖吗?

如何在Record Java中使用isRecord()和RecordComponent[]?

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

在Java Spring JPA中插入包含对其他实体的引用的列

如何将RESTAssured';S的Http标题转换为<;字符串、字符串和>的映射?

让标签占用JavaFX中HBox的所有可用空间

如何使用java区分以下结果