Java:制作一张地图<&燃气轮机;变量泛型
我需要将变量和值成对存储在某个地方,我倾向于使用Map。问题是值的类型会有所不同,所以我认为应该使用泛型。所以我试过这样的方法:Java:制作一张地图<&燃气轮机;变量泛型,java,generics,Java,Generics,我需要将变量和值成对存储在某个地方,我倾向于使用Map。问题是值的类型会有所不同,所以我认为应该使用泛型。所以我试过这样的方法: Map<String, T> netPara; Map-netPara; 当然,它不起作用,然后我尝试了 Map<String, Object> netPara; Map-netPara; 这是可行的,但当我检索值时,它只返回Object类型,而不是“boolean”、“int” 有人能帮我吗?我相信这很简单,但我还不是专家。提前谢谢
Map<String, T> netPara;
Map-netPara;
当然,它不起作用,然后我尝试了
Map<String, Object> netPara;
Map-netPara;
这是可行的,但当我检索值时,它只返回Object类型,而不是“boolean”、“int”
有人能帮我吗?我相信这很简单,但我还不是专家。提前谢谢
事实上,我有一个函数a,它接收一个参数列表,但函数B也会使用这些参数,但B的参数列表是可视的,因此我希望将它们存储为类参数,并由函数B重用。因此,我所做的是:
Class Person() {
Map<String, T> infoPaire; // if I use Object to replace T
Function A: receiver(boolean b, int i, String1 st1, String2 st2) {
infoPaire.put("b", b);
infoPaire.put("i", i);
infoPaire.put("st1", st1);
infoPaire.put("st2", st2);
}
Function B: user() {
boolean b = infoPaire.get("b"); // I need to add (boolean) to cast and I dont want it, it's ugly
int i = infoPaire.get("i");
String st1 = infoPaire.get("st1");
String st2 = infoPaire.get("st2");
}
Class-Person(){
Map infoPaire;//如果我使用对象替换T
函数A:接收器(布尔b、整数i、字符串1 st1、字符串2 st2){
infoPaire.put(“b”,b);
infoPaire.put(“i”,i);
infoPaire.put(“st1”,st1);
infoPaire.put(“st2”,st2);
}
函数B:用户(){
boolean b=infoPaire.get(“b”);//我需要将(boolean)添加到cast中,我不想要它,它很难看
int i=infoPaire.get(“i”);
字符串st1=infoPaire.get(“st1”);
字符串st2=infoPaire.get(“st2”);
}
您可以将其中一种类型设置为类型参数,但还必须将其声明为类型参数。仅为其指定一个字母名称(如T
)不会自动将其设置为类型参数
class MyClass<T> { // Note: T is a type parameter
private Map<String, T> netPara;
// ...
}
class MyClass{//注意:T是一个类型参数
私有地图;
// ...
}
您可以将其中一种类型设置为类型参数,但还必须将其声明为类型参数。仅为其指定一个字母名称(如T
)不会自动将其设置为类型参数
class MyClass<T> { // Note: T is a type parameter
private Map<String, T> netPara;
// ...
}
class MyClass{//注意:T是一个类型参数
私有地图;
// ...
}
您最希望的是一种类型的值对象和一种类型化的getter方法,该方法具有不安全的强制转换:
class VariableMap extends HashMap<String, Object> {
public <T> T getValue(Object key) {
return (T)super.get(key);
}
{
类VariableMap扩展了HashMap{
公共T getValue(对象键){
return(T)super.get(key);
}
{
您最希望的是一种类型的值对象和一种类型化的getter方法,该方法具有不安全的强制转换:
class VariableMap extends HashMap<String, Object> {
public <T> T getValue(Object key) {
return (T)super.get(key);
}
{
类VariableMap扩展了HashMap{
公共T getValue(对象键){
return(T)super.get(key);
}
{
T
需要定义为类或方法上的泛型参数
方法
或者通过类型推断
Test<String> t = new Test<>;
这是不可能的。因为T
虽然是泛型的,但最终必须解析为类实例的单个类型。例如
Map<String, Integer> m;
Map-m;
此映射只能保存整数值
将Object
声明为值之所以有效,是因为Java中的每个类都是Object
的子类,所以任何东西都可以放在其中。但是使用Object
是非常糟糕的设计。您实际上是在关闭类型系统,这是像Java这样的语言的主要优势之一gs到表中,静态键入
因此,如果您发现自己想要存储一组同质值,您可能需要重新考虑您的设计,即使是在明确允许此类内容的语言中(scheme、python、JavaScript等)以同质方式使用它们通常是设计缺陷的标志。
T
需要定义为类或方法上的通用参数
方法
或者通过类型推断
Test<String> t = new Test<>;
这是不可能的。因为T
虽然是泛型的,但最终必须解析为类实例的单个类型。例如
Map<String, Integer> m;
Map-m;
此映射只能保存整数值
将Object
声明为值之所以有效,是因为Java中的每个类都是Object
的子类,所以任何东西都可以放在其中。但是使用Object
是非常糟糕的设计。您实际上是在关闭类型系统,这是像Java这样的语言的主要优势之一gs到表中,静态键入
因此,如果您发现自己想要存储一组同质值,您可能需要重新考虑您的设计。即使是在明确允许此类内容的语言(scheme、python、JavaScript等)中,以同质方式使用它们通常是设计缺陷的标志。您需要理解并首先考虑。
就您的问题而言,对象类位于继承的顶层,这意味着对象是所有java类的父类
因此,您可以将任何对象强制转换为对象类而不进行强制转换,但当您需要将对象重新转换为其实际类时,您必须强制转换它。例如String str=(String)netPara.get(key);
你需要研究多态性、铸造和泛型概念。泛型来解决你现在面临的问题。你需要先理解和理解。
就您的问题而言,对象类位于继承的顶层,这意味着对象是所有java类的父类
因此,您可以将任何对象强制转换为对象类而不进行强制转换,但当您需要将对象重新转换为其实际类时,您必须强制转换它。例如String str=(String)netPara.get(key);
您需要研究多态性、强制转换和泛型概念。泛型来解决您目前面临的问题。以下是将元素放入映射的方法检查一下
public class TakingInput {
public static void main(String[] args) {
Map<String,Object> map=new HashMap<String,Object>();
Integer in=new Integer(123);
Object obj=in;
String s=new String("suresh");
Object obj2=s;
map.put("hi",obj);
map.put("ramesh",obj2);
System.out.println(map);
//to retrive
String ss=(String) map.get("ramesh"); //type casting
System.out.println(ss); //o/p:suresh
}
}
公共类获取输入{
公共静态void main(字符串[]args){
Map Map=newhashmap();
整数in=新整数(123);
对象obj=in;
字符串s=新字符串(“suresh”);
对象obj2=s;
地图放置(“hi”,obj);
map.pu
Test<String> t = new Test<>;
Map<String, String> m = t.getMap();
Test<Integer> t2 = new Test<>;
Map<String, Integer> m2 = t2.getMap();
m.put('int', 7)
m.put('bool', true)
Map<String, Integer> m;
public class TakingInput {
public static void main(String[] args) {
Map<String,Object> map=new HashMap<String,Object>();
Integer in=new Integer(123);
Object obj=in;
String s=new String("suresh");
Object obj2=s;
map.put("hi",obj);
map.put("ramesh",obj2);
System.out.println(map);
//to retrive
String ss=(String) map.get("ramesh"); //type casting
System.out.println(ss); //o/p:suresh
}
}
BigDecimal n = dictionary.get("n");
String s = dictionary.get("s");
class Dictionary {
public <T> T get(String name) { ... }
BigDecimal n = dictionary.get(BigDecimal.class, "n");
String s = dictionary.get(String.class, "s");
public class Dictionary {
private Map<String, Object> map = new HashMap<>();
public <S> S put(Class<S> type, String name, S value) {
Object oldValue = map.put(name, value);
return type.cast(oldValue);
}
public <T> T get(Class<T> type, String name) {
Object value = map.get(name);
return type.cast(value);
}
}
Map<String, String> m = new HashMap<>();
m.put("bool", "true");
m.put("int", "1");
Integer i = Integer(m.get("int"));
Boolean b = Boolean(m.get("bool"));
Map<String, String> stringMap;
Map<String, Integer> intMap;
Map<String, Boolean> boolMap;