Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将泛型参数传递给方法?_Java_Generics - Fatal编程技术网

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
}