如何从 Java 中的 PersonRepo 中删除泛型 <T extends AbstractRepo>?

问题描述

我正在尝试创建一个用于在 Java 中执行事务的库类。这是代码示例。

class AbstractRepo {
    <T extends AbstractRepo> void transactional(Consumer<T> consumer) {
        System.out.println("Transaction started.");
        consumer.accept((T) this); //try-catch removed for brevity
        System.out.println("Transaction finished.");
    }
}

class PersonRepo extends AbstractRepo {
    void addPerson() {
        System.out.println("Adding person.");
    }

    void addAddress() {
        System.out.println("Adding address.");
    }
}

public class Application {
    public static void main(String[] args) {
        var personRepo = new PersonRepo();
        personRepo.<PersonRepo>transactional(it -> {
            it.addPerson();
            it.addAddress();
        });
    }
}

每当 PersonRepo 调用事务性时,它都应始终采用类型为 Consumer<PersonRepo> 的参数。但是,从上面的代码可以看出,客户端需要添加泛型来执行personRepo的操作。

一个解决方法是在类级别而不是方法级别添加泛型。

class AbstractRepo<T extends AbstractRepo> {
    void transactional(Consumer<T> consumer) {
        
    }
}

class PersonRepo extends AbstractRepo<PersonRepo> {
 
}

public class Application {
    public static void main(String[] args) {
        var personRepo = new PersonRepo();
        personRepo.transactional(it -> {
            it.addPerson();
            it.addAddress();
        });
    }
}

现在客户端可以在不添加泛型的情况下调用 transactional()。但是,这使得代码比现在更奇怪。我认为我以完全错误的方式处理这个问题。有没有更好的办法? 我想在超类中实现一个方法,该方法将其实现(调用)子类的 Consumer 作为其参数。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)