Java 如何将泛型参数传递给方法?
我试图存储作为抽象类的子类的对象,但这里说明了一个问题:Java 如何将泛型参数传递给方法?,java,generics,Java,Generics,我试图存储作为抽象类的子类的对象,但这里说明了一个问题: abstract class Letter { public void store_object(Letter letter) { HashMap<Class<? extends Letter>, ? extends Letter> map = new HashMap<>(); map.put(letter.getClass(), letter); <--
abstract class Letter {
public void store_object(Letter letter) {
HashMap<Class<? extends Letter>, ? extends Letter> map = new HashMap<>();
map.put(letter.getClass(), letter); <-- this line throws an error
}
}
class A extends Letter {}
class B extends Letter {}
或
错误是:
no suitable method found for put(Class<CAP#1>,NewClass19.Letter)
method Map.put(Class<? extends NewClass19.Letter>,CAP#2) is not applicable
(argument mismatch; NewClass19.Letter cannot be converted to CAP#2)
method AbstractMap.put(Class<? extends NewClass19.Letter>,CAP#2) is not applicable
(argument mismatch; NewClass19.Letter cannot be converted to CAP#2)
method HashMap.put(Class<? extends NewClass19.Letter>,CAP#2) is not applicable
(argument mismatch; NewClass19.Letter cannot be converted to CAP#2)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends NewClass19.Letter from capture of ? extends NewClass19.Letter
CAP#2 extends NewClass19.Letter from capture of ? extends NewClass19.Letter
我真的不确定您在这里要做什么,但这将使您的代码编译:
abstract class Letter {
public <T extends Letter> void store_object(T letter) {
HashMap<Class<? extends Letter>, T> map = new HashMap<>();
map.put(letter.getClass(), letter); // <-- this line throws an error
}
}
class A extends Letter {}
class B extends Letter {}
你到底有什么问题?我真的不知道你在这里想做什么,但这会让你的代码编译:
abstract class Letter {
public <T extends Letter> void store_object(T letter) {
HashMap<Class<? extends Letter>, T> map = new HashMap<>();
map.put(letter.getClass(), letter); // <-- this line throws an error
}
}
class A extends Letter {}
class B extends Letter {}
你的问题到底是什么?它需要它需要给定B扩展一个类,你的代码将编译,你这样做实际上不会丢失任何东西:。给定B扩展一个类,你的代码将编译,你这样做实际上不会丢失任何东西:。你能发布准确的错误吗?还有,你说它是字母的直接例子是什么意思?如果这封信是抽象的,你怎么能有一个它的直接实例呢?错误已经发布了。这与HashMap需要类型为的变量有关?扩展字母,但它得到的却是字母类型的变量。当我说字母的直接实例时,这就是我所指的。你可以使用一个集合,如果你需要知道某个地方的类型,你可以使用instanceof。这个集合也将接受字母的子类。我认为您是在增加复杂性,而不是减少复杂性。雅格尼。不过,我现在正试图找出如何修复它。YAGNI肯定不适用于这里,因为我多年来一直需要并使用它。只有当我试图将VFramePanel和VDialogPanel的方法组合成一个超类型时,我才遇到问题。一开始很复杂,但一旦完成,就可以减少打开多个窗口、刷新窗口内容等方面的麻烦。你能公布确切的错误吗?还有,你说它是字母的直接例子是什么意思?如果这封信是抽象的,你怎么能有一个它的直接实例呢?错误已经发布了。这与HashMap需要类型为的变量有关?扩展字母,但它得到的却是字母类型的变量。当我说字母的直接实例时,这就是我所指的。你可以使用一个集合,如果你需要知道某个地方的类型,你可以使用instanceof。这个集合也将接受字母的子类。我认为您是在增加复杂性,而不是减少复杂性。雅格尼。不过,我现在正试图找出如何修复它。YAGNI肯定不适用于这里,因为我多年来一直需要并使用它。只有当我试图将VFramePanel和VDialogPanel的方法组合成一个超类型时,我才遇到问题。一开始很复杂,但一旦完成,就可以减少打开多个窗口、刷新窗口内容等方面的麻烦。我之所以问XY问题,是因为真实场景要复杂得多,很难复制。我正在用一个较小的形式说明这个问题。这可能会让人沮丧,谢谢你的链接,但当我问一些与我实际问题接近的问题时,由于复杂性,这些问题没有得到回答。@ryvantage我的版本是否指定了方法类型参数void。。。帮助你们解决你们真正的问题?是的,我知道物体是错的,我只是用它来说明我的脑袋在往哪里走。有时这似乎有帮助。耸肩我问XY问题的原因是,实际情况要复杂得多,很难复制。我正在用一个较小的形式说明这个问题。这可能会让人沮丧,谢谢你的链接,但当我问一些与我实际问题接近的问题时,由于复杂性,这些问题没有得到回答。@ryvantage我的版本是否指定了方法类型参数void。。。帮助你们解决你们真正的问题?是的,我知道物体是错的,我只是用它来说明我的脑袋在往哪里走。有时这似乎有帮助。Shrugs你为什么建议super?从收藏的角度来看,它正在“消费”这些物品。消费通常意味着你需要超高的价格。见上面的链接。示例:您有一个列表。您希望将类别A的对象放入其中。如果A扩展了T,意味着T super A,那么可以。你为什么要建议super?从集合的角度来看,它正在“消费”这些对象。消费通常意味着你需要超高的价格。见上面的链接。示例:您有一个列表。您希望将类别A的对象放入其中。如果A扩展了T,表示T超A,则可以。
abstract class Letter {
public <T extends Letter> void store_object(T letter) {
HashMap<Class<? extends Letter>, T> map = new HashMap<>();
map.put(letter.getClass(), letter); // <-- this line throws an error
}
}
class A extends Letter {}
class B extends Letter {}
private static HashMap<Class<? extends Test>, Test> map = new HashMap<>();
static void addTest(Test test) {
map.put(test.getClass(), test);
}
public <T extends Letter> void method(T arg1)
static Map<Class<? extends VCorePanel>, VCorePanel> self...pm;
public static showPanel(T newInstance){
...
VCorePanel OldInstance = self_panel_map.get(newInstance.getClass()); //use
...
self_panel_map.put(newInstace.getClass(), newInstance); //storage
}