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

时间:2011-03-03 15:01:27

标签: 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;
      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);
}

此代码无法在以下行编译:

this.doSomething(m); 

出现此错误:

Error : SimpleClass.java:[34,10] doSomething(T) in SimpleClass<T> cannot be applied to (java.lang.reflect.Method)

我在这里遗漏了什么吗?类型参数T标记为T extends AnnotatedElement。因此,我希望调用doSomething并使用java.lang.reflect.Method参数进行成功编译。

4 个答案:

答案 0 :(得分:2)

Method实现AnnotatedElement,但这并不要求T是一个方法。如果该类声明为SimpleClass<Constructor>怎么办?这满足<T extends AnnotatedElement>,但不支持从Method转换。

答案 1 :(得分:0)

无法知道T是Method。它也可以是例如一个Package,然后你的操作()没有意义,尝试将Method传递给期待Package

的内容

答案 2 :(得分:0)

这是因为T在这里并不重要。您所知道的是类型为AnnotatedElement

以下更改将使其编译:

 protected abstract void doSomething(AnnotatedElement annotatedElement);

答案 3 :(得分:0)

您的通用方法未正确实施。将您的通用方法更改为

protected abstract<T extends AnnotatedElement> void doSomething(T annotatedElement);

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