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);