0

假设我有一个名为 Model 的抽象类,具有以下静态方法:

 
公共抽象类模型{
    ...
    公共静态列表<模型>所有(){
       ...
    }
    ...
}

一个具体的类扩展了它:

公共类人扩展模型{
...
}

那么,是否有可能使用静态上下文 Person.all()返回一个列表Person而不是列表Model

你知道,通过使用模板,或反射方法,如getClass().getClassName()getClass().getDeclaredMethod()等。

我之所以这么问,是因为我在 PHP 库中看到了这一点,并且我正在 java 中创建一个类似的库。

4

1 回答 1

0

你应该尽可能避免反思。它很慢,很难调试,它绕过了类型和签名的编译时检查,而且它不能在运行时由 JIT 进行优化。

您可能想改用供应商:

public static <M extends Model> List<M> all(Supplier<M> constructor) {
    List<M> models = new ArrayList<>();

    for ( /* ... */ ) {
        M model = constructor.get();

        // initialize model here
        // ...

        models.add(model);
    }
}

该方法的调用如下所示:

List<Person> allPersons = all(Person::new);

当然,假设 Person 类有一个零参数的构造函数,或者根本没有定义构造函数。

于 2018-02-25T14:10:43.670 回答