Java 为什么我的代码报告错误:';两种方法具有相同的擦除,但都不覆盖另一种方法';?

Java 为什么我的代码报告错误:';两种方法具有相同的擦除,但都不覆盖另一种方法';?,java,generics,Java,Generics,下面代码中的行public T putBean(T object){报告了错误:“两个方法具有相同的擦除,但都不覆盖另一个”。 @覆盖 公共T putBean(T对象){ DefaultListableBeanFactory beanFactory=(DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory(); BeanDefinition BeanDefinition=新的GenericBeanD

下面代码中的行
public T putBean(T object){
报告了错误:“两个方法具有相同的擦除,但都不覆盖另一个”。

@覆盖
公共T putBean(T对象){
DefaultListableBeanFactory beanFactory=(DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
BeanDefinition BeanDefinition=新的GenericBeanDefinition();
beanDefinition.setBeanClassName(object.getClass().getName());
beanFactory.registerBeanDefinition(object.getClass().getName(),beanDefinition);
返回(T)对象;
}
如果我将
public T putBean(T object){
更改为
public T putBean(object object){
,则不会再次报告任何错误。新代码如下:

 @Override
public <T> T putBean(Object object) {
    DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
    BeanDefinition beanDefinition = new GenericBeanDefinition();
    beanDefinition.setBeanClassName(object.getClass().getName());
    beanFactory.registerBeanDefinition(object.getClass().getName(),beanDefinition);
    return (T) object;
}
@覆盖
公共T putBean(对象){
DefaultListableBeanFactory beanFactory=(DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
BeanDefinition BeanDefinition=新的GenericBeanDefinition();
beanDefinition.setBeanClassName(object.getClass().getName());
beanFactory.registerBeanDefinition(object.getClass().getName(),beanDefinition);
返回(T)对象;
}
为什么第一个代码报告错误“两个方法具有相同的擦除,但都不覆盖另一个”?
如果我仍然想使用
public T putBean(T object){
,我该怎么办?

由于修改后的版本可以正常工作,您似乎正在用签名覆盖超类/接口中的方法:

public <T> T putBean(Object object)
因此,当您在子类中编写时:

@Override
public <T> T putBean(T object)
@覆盖
公共T putBean(T对象)
您正在指定一个不兼容的签名,但由于类型擦除,该方法实际上在内部变得兼容,编译器正在抱怨这种冲突

如果要重写方法,
@override
注释似乎表明要重写该方法,则参数必须是
对象


如果您不打算重写该方法,那么您需要给这个新方法一个不同的名称。

您在这里重写的方法是什么?不要放置图像,而是添加您的示例代码,一个简化的版本就可以了。请查看此内容以进一步澄清:您的“签名”是什么意思?您能给我看相关文章吗。@shadowsocks
public Object putBean(Object object)
@Override
public <T> T putBean(T object)