Java泛型-在方法参数中使用封闭类的泛型类型参数

Java泛型-在方法参数中使用封闭类的泛型类型参数,java,generics,Java,Generics,下面是一个简单的泛型类,它接受一个泛型类型参数,该参数与声明为该类类型参数的参数相同: import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; public abstract class SimpleClass<T extends AnnotatedElement> { public void operate() { Method m = null;

下面是一个简单的泛型类,它接受一个泛型类型参数,该参数与声明为该类类型参数的参数相同:

import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;

public abstract class SimpleClass<T extends AnnotatedElement>
{

   public void operate()
   {
      Method m = null;
      this.doSomething(m); // Error : SimpleClass.java:[34,10] doSomething(T) in SimpleClass<T> cannot be applied to (java.lang.reflect.Method)
   }
   protected abstract void doSomething(T annotatedElement);
}
出现此错误时:

Error : SimpleClass.java:[34,10] doSomething(T) in SimpleClass<T> cannot be applied to (java.lang.reflect.Method)
错误:SimpleClass.java:[34,10]SimpleClass中的doSomething(T)无法应用于(java.lang.reflect.Method)

我是不是遗漏了什么?类型参数T被标记为T扩展注释删除。因此,我希望使用java.lang.reflect.Method参数对doSomething的调用能够成功编译。

方法实现AnnotateDelete,但这并不要求t是一个方法。如果类被声明为
SimpleClass
,该怎么办?它满足
,但不支持从
方法转换

无法知道t是
方法。它也可以是一个
,然后你的operate()就没有意义了,试图将
方法
传递给期望
包的东西
,这是因为
t
在这里无关紧要。您只知道类型是
AnnotatedElement

以下更改将使其可编译:

 protected abstract void doSomething(AnnotatedElement annotatedElement);

您的泛型方法未正确实现。将泛型方法更改为

protected abstract<T extends AnnotatedElement> void doSomething(T annotatedElement);
受保护的抽象无效文件(T注释删除);

上面的语句创建了正确的泛型方法。这将删除编译错误。

首先考虑:
方法
不是
注释删除
的子类,而是实现它的类。@R.Bemrose:这与这里无关。@JeremyHeller:我在阅读Java规范后意识到,但他把事情搞砸了,不让我删除那条评论。我明白你的意思。但更进一步,如果我将类和方法定义更改为:
public抽象类SimpleClass{public void operate(){method m=null;this.doSomething(m);//立即编译!}受保护的抽象void doSomething(U annotatedElement);}
它开始编译时很好@Java用户:这是因为您正在定义一个方法级泛型,它不依赖于类上定义的泛型。对于这种格式设置,我很抱歉,我很难让它正确显示出来,@Jeremy,谢谢您的解释。我现在明白发生了什么。另外,我想我需要读一些泛型的书来真正了解它。再次感谢。@Java:是的,它可以编译,但在该方法中,您现在有两个泛型类型:T和U,它们都实现了AnnotateDelete,但可能相关,也可能不相关。
protected abstract<T extends AnnotatedElement> void doSomething(T annotatedElement);