当前位置: 代码迷 >> java >> 如何将通用参数传递给方法?
  详细解决方案

如何将通用参数传递给方法?

热度:33   发布时间:2023-07-31 11:59:42.0

我正在尝试存储作为抽象类的子类的对象,但是这里说明了一个问题:

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 {}

究其原因map.put抛出一个错误是, letter不是一个子类的Letter (这是一个直接的实例Letter )。

有没有一种方法可以将方法参数更改为Letter的通用子类? 就像是:

public void store_object(? extends Letter letter) {

要么

public void store_object(Object<? extends Letter> 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 {}

为什么每次调用store_object方法时都会生成一个新的HashMap 你真正的问题是什么? 请阅读

相关:


顺便说一句, Object<Anything>总是错误的,因为未对Object进行参数化。


因此,我看到了您的编辑,仅供参考,我为您编译:

private static HashMap<Class<? extends Test>, Test> map = new HashMap<>();

static void addTest(Test test) {
    map.put(test.getClass(), test);
}

到底是什么问题

给定B extends AClass<? extends B> Class<? extends B> 不是 Class<? extends A>的子类型Class<? extends A> Class<? extends A> ,因此使用Class<? extends Letter>的泛型边界Class<? extends Letter> Class<? extends Letter>是没有用的。

相反,只需将键类型指定为<Class<?> ,您的代码将被编译(这样做实际上不会丢失任何内容):

它必须是<? super Letter> <? super Letter> 有一个很好的首字母缩写词可以帮助您记住

如果要使用通用参数,请执行以下操作:

public <T extends Letter> void method(T arg1) 

** ^

编辑:刚刚看到您的编辑。 本来我以为您只是将对象放入某个集合中。 静态映射声明类型参数正确。 因为这一个实例将通过一切为使用和储存使用,因此它需要<Class<? extends>, VCorePanel> <Class<? extends>, VCorePanel>

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
}

ps。 如果您使用的是Java 8,则可以传入构造函数,而不是使用反射库。 如有需要,请调查一下。

  相关解决方案