1个回答

test
2024-07-13
这个是Java泛型方法返回值的语法,需要在返回类型前声明自己所使用的泛型类型。
下面解释为什么isEqual
需要写前面的<T>
而图片上面的or
方法不需要:
Predicate
类本身是一个泛型类,在声明时使用了Predicate<T>
。
or
的签名为default Predicate<T> or(Predicate<? super T> other)
,这是一个成员函数,这里的T
和类的T
是同一个类型。在类被实例化后,T拥有了具体的类型(假设是T1),在这个实例上调用成员函数,成员函数or
返回值的类型也就确定了是Precicate<T1>
。
但由于isEqual
是类方法,它无法获取到类Predicate<T>
中的类型T
,所以这个T
是一个新的类型,只是恰好和类名称Predicate<T>
中的T
名字相同。如果不声明<T>
,编译器会抱怨不知道Predicate<T>
中的T
是什么。
事实上,即使是成员方法,也可以在返回值前面添加<T>
来覆盖泛型类的泛型类型T
,例如可以声明 default <T> Predicate<T> or(Predicate<? super T> other)
。(当然这种情况下最好使用另一个类型标识符)
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容