微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从 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 举报,一经查实,本站将立刻删除。