如何解决PHPStan提示泛型接口ListOrderedInterface返回类型未指定类型的问题?
解决PHPStan泛型接口返回类型报错问题
问题原因
你遇到的报错是因为ListOrderedInterface是带泛型的接口,当它作为方法返回类型时,PHPStan要求必须明确指定泛型的具体类型参数,不能只写接口名称。
解决方法
给工厂接口也添加泛型模板声明,让makeList方法的返回类型绑定对应的泛型参数:
1. 保持原有序列表接口不变
/** * @template ListOrderedElement */ interface ListOrderedInterface { /** * @param ListOrderedElement $element * @return void */ public function add($element): void; // 其他自定义方法 }
2. 修改工厂接口,添加泛型模板
/** * @template T */ interface ListOrderedFactoryInterface { /** * @return ListOrderedInterface<T> */ public function makeList(): ListOrderedInterface; }
额外说明
- 如果你的工厂是专门创建某一固定类型的有序列表(比如字符串列表),也可以直接指定具体类型,无需给工厂加泛型:
interface ListOrderedFactoryInterface { /** * @return ListOrderedInterface<string> */ public function makeList(): ListOrderedInterface; } - 当实现
ListOrderedFactoryInterface时,你可以在实现类中明确泛型的具体类型,比如:/** * @implements ListOrderedFactoryInterface<int> */ class IntListOrderedFactory implements ListOrderedFactoryInterface { public function makeList(): ListOrderedInterface { return new IntOrderedList(); // 假设这个类实现了ListOrderedInterface<int> } }
内容的提问来源于stack exchange,提问作者Doug Wilbourne
相关产品推荐
相关产品推荐

