不,这个问题不是关于之间的区别吗?和T;这是关于我如何参数转换为命名的。考虑以下示例代码:import java.io.Serializable;class A<T extends Serializable> { <S extends Serializable> void bar(S arg) { } void bar2(T arg) { }}public class B { A<? extends Serializable> myA = null; <T extends Serializable> void foo(T arg) { myA.bar(arg); myA.bar2(arg); }}我的问题是上述内容无法编译;对bar2()的调用给了我The method bar2(capture#2-of ? extends Serializable) in the typeA<capture#2-of ? extends Serializable> is not applicable for the arguments (T)我猜这的“原因”是myA是;但是B.foo中的T很好,名为T;而不是通配符?。解决此问题的一种方法是使为类B的类型参数...但这基本上与我对该类的其他用法冲突。含义:我最终这样写下了B及其成员myA-正是因为我不想参数化B类。因此,我仅从bar2()方法开始;然后在以后添加bar()……但这实际上也没有帮助。所以-有没有办法让我的类B在示例代码中将A.bar2()用作“预期”?编辑:准确地说-bar()方法对我没有帮助;因为那里的“ S”与我在A类中实际使用的“ T”不兼容。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 @JBNizet已经解释了为什么不能做到这一点。该答案旨在说明您可能有的选择(在您的问题中正确指出其中之一,但这不是唯一的选择)。使B接受类型参数class B<T extends Serializable> { A<T> myA = null; void foo(T arg) { myA.bar(arg); myA.bar2(arg); }}使B从A扩展(如果B通过A的is-a测试)class B extends A<String> { public void foo(String arg) { bar2(arg); bar(1); }}两种选择之间的区别在于1)bar和bar2都必须传递与2中相同的类型,而2)bar和bar2可以传递不同的类型,因为bar2受为A声明的类型参数,其中bar由为方法声明的类型参数绑定。 (adsbygoogle = window.adsbygoogle || []).push({});
10-06 11:24