我有一个简单的泛型类,它接受泛型类型参数,它与声明为类的类型参数的参数相同:
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参数进行成功编译。
答案 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);
上面的语句创建了正确的泛型方法。这将删除编译错误。