【问题标题】:Add generic value to a map in generic method in java在java中的泛型方法中将泛型值添加到映射中
【发布时间】:2017-10-30 04:04:06
【问题描述】:

我对 java 泛型(使用 IntelliJ)不太熟悉。 我想要的是向集合添加通用值。 下面的代码有两个问题。

我读过https://docs.oracle.com/javase/tutorial/java/generics/methods.htmlhttps://docs.oracle.com/javase/tutorial/extra/generics/methods.html 但不知道为什么下面的代码有错误。

Q1) 我在 add 方法中的 map.put(T, T); 中有错误消息,因此 Ts 下的红色波纹:预期表达式,引入局部变量

Q2) 想知道在这种情况下,我应该将类声明为public class Test<T> 还是可以声明public class Test

public class Test<T> {
Map<T, T> map;


public Test() {
    map = new HashMap<T, T>();        
}

public <T> void add(T value) throws Exception {
    map.put(value, value);  // Q1) red ripple under value: Expression Expected, introduce local variable

}
}

【问题讨论】:

  • 从您的方法中删除 &lt;T&gt;。您正在隐藏类参数。
  • 你是说map.put(value, value)吗?
  • 你也不能put(T, T)。也许你的意思是put(value, value)
  • 你能提供一些上下文吗?什么是类测试?如果没有更多信息,就不可能回答问题 2。
  • 啊,抱歉,打错了。当然我的意思是map.put(value, value);

标签: java generics


【解决方案1】:

这里有两个问题。

  1. 泛型方法参数T隐藏了类一T。它们是不同的类型,您无法引用 T(除非您重命名其中一个)。

  2. 方法map.put 需要T 类型的值,而不是这种类型本身(它不是Class 的实例)。

解决办法:

public void add(T value) throws Exception {
    map.put(value, value);
}

想知道在这种情况下,我应该将类声明为public class Test&lt;T&gt; 还是可以声明public class Test

如果您想要几个泛型方法,则不一定需要声明类泛型类型 - 使用它们自己的泛型类型创建您的方法。请注意,它们之间不会有任何相似之处。

但是,就您而言,泛型类型 T 是强制性的,因为您声明了泛型字段 Map&lt;T, T&gt; map

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-08-05
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多