我不熟悉java Generics(使用IntelliJ)。 我想要的是为集合添加通用值。 下面的代码有两个问题。
我看了https://docs.oracle.com/javase/tutorial/java/generics/methods.html 和https://docs.oracle.com/javase/tutorial/extra/generics/methods.html 但不知道为什么下面的代码有错误。
Q1)我在map.put(T, T);
的add方法中有错误信息,这样在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
}
}
答案 0 :(得分:1)
这里有两个问题。
通用方法参数T
隐藏了第一类T
。它们是不同的类型,您无法引用T
(除非您重命名其中一个)。
方法map.put
需要T
类型的值,而不是此类型本身(无论如何它都不是Class
的实例)。
解决方案:
public void add(T value) throws Exception {
map.put(value, value);
}
在这种情况下想知道,我应该将课程声明为
public class Test<T>
还是我可以声明public class Test
?
如果您想要几个通用方法,则不一定需要声明类泛型类型 - 使用自己的泛型类型创建方法。请注意,它们之间不会有任何相似之处。
但是,在您的情况下,通用类型T
是必需的,因为您声明了通用字段Map<T, T> map
。