【问题标题】:How to inherit a generic static method in Java? [duplicate]如何在 Java 中继承泛型静态方法? [复制]
【发布时间】:2020-06-18 14:36:21
【问题描述】:

10 多年前,我向this question 询问了有关 C# 的问题,并在那里得到了很好的答案。现在我正在尝试在 Java 中做同样的事情。

假设我有一个抽象类Animal。我想要那个类中的静态方法create(),它将返回一个类型的值,无论 subclass 是什么类型。我使用以下结构在 C# 中管理它:

public class Animal<T> where T : Animal<T>, new()
{
    public static T Create()
    {
        var t = new T();
        // do generic stuff on the new T instance
        return t;
    }
}

public class Dog : Animal<Dog>
{

}

//usage:
var dog = Dog.Create();

这在 C# 中很有用。但现在我正试图在 Java 中复制这种结构,并碰壁。一大堵墙似乎是you can't have static generic members。因此,这似乎有点引人注目。但我是一个乐观的人,也许那里的一些 Java 专家已经提出了一种完全开箱即用的模式来或多或少地实现我在这里尝试做的事情?

【问题讨论】:

标签: java generics


【解决方案1】:

问题是在 Java 中你不能像这样从类型变量构造实例。

作为一种快速的替代方法,您可以使用您的代码通过具体的构造函数调用来辅助的工厂

@FunctionalInterface
interface AnimalFactory<T extends Animal> {
    T create();

    static <U extends Animal> AnimalFactory<U> ofClass(Class<U> type) {
        return () -> {
            try {
                return type.newInstance();
            } catch (Exception e) {
                // handle
                throw new RuntimeException(e);
            }
        };
    }

    static <U extends Animal> AnimalFactory<U> ofSupplier(Supplier<U> creator) {
        return creator::get;
    }
}

然后你可以在你的 Animal 静态方法中调用它(你确实可以将它重用于其他类型):

class Animal {
    static <T extends Animal> T create(Class<T> type) {
        T instance = AnimalFactory.ofClass(type)
                .create();
        // do generic stuff on the new T instance
        return instance;
    }

    static <T extends Animal> T create(Supplier<T> creator) {
        T instance = AnimalFactory.ofSupplier(creator)
                .create();
        // do generic stuff on the new T instance
        return instance;
    }
}

最后,您的调用代码如下所示。我使用了 lambda 和基于反射的方法。你选。

Dog d = Animal.create(Dog.class);
Dog e = Animal.create(Dog::new);

当然,您可以完全跳过Animal 中的静态方法,直接使用AnimalFactory(接口现在可以有静态方法,您可以使用这些静态方法来运行// do generic stuff on the new T instance 逻辑)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多