Java 如何将参数作为泛型传递?

Java 如何将参数作为泛型传递?,java,generics,Java,Generics,我有: 公共类AClass{ 公共AClass(){ } 公共空间法(E元素){ //某物 } } 公共类B实现了一个接口{ } 呼叫代码: public class<E extends aninterface> AClass{ public AClass(){ } public void amethod(E element){ //something } } public class B implements aninter

我有:

公共类AClass{
公共AClass(){
}
公共空间法(E元素){
//某物
}
}
公共类B实现了一个接口{
}
呼叫代码:

public class<E extends aninterface> AClass{

    public AClass(){
    }

    public void amethod(E element){
        //something
    }

}

public class B implements aninterface{

}
a接口f=new B();
AClass ac=新的AClass();
ac.amethod(f);
它说f是type
接口,但参数是type'E'

如果我不能做到这一点,我不明白泛型的意义是什么?

因为
AClass.amethod()
需要一个
B
作为参数。但是你要给它传递一个
接口

,因为
AClass.amethod()
需要一个
B
作为参数。但是您正在传递一个
接口
注意,引用
f
被声明为
接口类型
——而不是
B
类型。尽管在运行时引用
f
指向类型
B
的实例,编译器在这里只寻找引用
f
的声明类型与
AClass(E)
所要求的
B
之间的对齐

也许你是想写这个

aninterface f = new B();
AClass<B> ac = new AClass<B>();
ac.amethod(f);
final aninterface f = new B();
final AClass<? super aninterface> ac = new AClass<aninterface>();
ac.amethod(f);
final a接口f=new B();
最后一级注意,引用
f
声明为
a接口类型,而不是
B
类型。尽管在运行时引用
f
指向类型
B
的实例,编译器在这里只寻找引用
f
的声明类型与
AClass(E)
所要求的
B
之间的对齐

也许你是想写这个

aninterface f = new B();
AClass<B> ac = new AClass<B>();
ac.amethod(f);
final aninterface f = new B();
final AClass<? super aninterface> ac = new AClass<aninterface>();
ac.amethod(f);
final a接口f=new B();

最后一个aclass这个例子首先与泛型有什么关系?泛型不允许没有它们就做不到的事情。他们只是帮你省下一些打字时间。如果你在没有泛型的情况下重写你的代码,那么显然它是不起作用的。把“E”改成“接口”,它就起作用了……是的,它会起作用,还有?也许你认为它应该起作用,因为f实际上是B?好的,这在python、ruby或php中可以工作,但在java和c#中不行;或者将接口b=new b()插入该方法!!!是的,因为
B
它扩展/实现了
接口。或者,换言之,
B
一个接口
,加上其他一些东西,可以在需要
接口的任何地方使用。事实并非如此。当您需要
B
时,不能使用
a接口
。这个示例首先与泛型有什么关系?泛型不允许没有它们就做不到的事情。他们只是帮你省下一些打字时间。如果你在没有泛型的情况下重写你的代码,那么显然它是不起作用的。把“E”改成“接口”,它就起作用了……是的,它会起作用,还有?也许你认为它应该起作用,因为f实际上是B?好的,这在python、ruby或php中可以工作,但在java和c#中不行;或者将接口b=new b()插入该方法!!!是的,因为
B
它扩展/实现了
接口。或者,换言之,
B
一个接口
,加上其他一些东西,可以在需要
接口的任何地方使用。事实并非如此。当您需要
B
时,您不能使用
a接口
。但是B实现了一个接口动态绑定?@peroni_santo:的确如此。但“动态”意味着“在运行时”。编译器处理静态类型信息,因此会出现错误消息。@peroni_santo:a
B
是一个
接口
,但a
接口
不一定是a
B
,而是B实现了一个接口-动态绑定?@peroni_santo:确实如此。但“动态”意味着“在运行时”。编译器使用静态类型信息,因此会出现错误消息。@peroni_santo:a
B
是一个
接口
,但a
接口
不一定是一个
B