Java 我是否可以更具体地传递一个二维数组,其中一个维度是字符串,而另一个维度是";“通用”;

Java 我是否可以更具体地传递一个二维数组,其中一个维度是字符串,而另一个维度是";“通用”;,java,generics,types,Java,Generics,Types,我的功能原型: private String buildParamaters(Object[][] arguments) 此方法建立一个URL 参数的示例值可能是: List<String> items = ... new Object[][] {{"key1", 25}, {"key2", "a string"}, {"key3", items}} 列表项=。。。 新对象[][{{“key1”,25}, {“ke

我的功能原型:

private String buildParamaters(Object[][] arguments)
此方法建立一个URL

参数的示例值可能是:

List<String> items = ...
new Object[][] {{"key1", 25}, 
                {"key2", "a string"},
                {"key3", items}}
列表项=。。。
新对象[][{{“key1”,25},
{“key2”,“字符串”},
{“key3”,items}
因此,第一个维度始终是字符串,但第二个维度可以是一系列类型


如何定义此参数以使第一个维度为字符串而不是对象[][]?还有一个额外的问题:除了将第二维度定义为泛型类型之外,还有什么切实可行的替代方法吗?

将数组替换为自定义对象数组,如下所示:

public class KeyedItem {
     private final String key;
     private final Object value;
     public KeyedItem(String key, Object value) {
         this.key = key;
         this.value = value;
     }
}
...
private String buildParamaters(KeyedItem[] arguments) {
    ...
}
...
KeyedItem[] arguments = new KeyedItem[] {
    new KeyedItem("key1", 25)
,   new KeyedItem("key2", "a string")
,   new KeyedItem("key3", items)
};

将数组替换为自定义对象数组,如下所示:

public class KeyedItem {
     private final String key;
     private final Object value;
     public KeyedItem(String key, Object value) {
         this.key = key;
         this.value = value;
     }
}
...
private String buildParamaters(KeyedItem[] arguments) {
    ...
}
...
KeyedItem[] arguments = new KeyedItem[] {
    new KeyedItem("key1", 25)
,   new KeyedItem("key2", "a string")
,   new KeyedItem("key3", items)
};

你确定你不想为此使用a吗?例如:

HashMap<String, Object> items = new HashMap<String, Object>();
items.put("key1", 25);
HashMap items=newhashmap();
项目。放置(“键1”,25);

您确定不想为此使用a吗?例如:

HashMap<String, Object> items = new HashMap<String, Object>();
items.put("key1", 25);
HashMap items=newhashmap();
项目。放置(“键1”,25);

您要查找的是字符串和对象之间的映射,因此类似于:

Map<String, Object>
Map

或者,如果在类型参数化方法或类中发生这种情况,您可能需要放置类型参数,而不是
对象。

您要查找的是字符串和对象之间的映射,因此类似于:

Map<String, Object>
Map

或者,如果在类型参数化方法或类中发生这种情况,您可能希望放置一个类型参数,而不是
对象。

由于您希望构建URL,您还可以使用from的集合,它允许您为一个键设置多个值,就像查询参数一样:

Multimap<String, Object> params = HashMultimap.create();
params.put("key1", "value1");
params.put("key2", 2);
params.put("key2", 3);
Multimap params=HashMultimap.create();
参数put(“键1”、“值1”);
参数put(“键2”,2);
参数put(“键2”,3);

由于您想要构建URL,您还可以使用from的集合,这允许您对一个键有多个值,查询参数也可以这样做:

Multimap<String, Object> params = HashMultimap.create();
params.put("key1", "value1");
params.put("key2", 2);
params.put("key2", 3);
Multimap params=HashMultimap.create();
参数put(“键1”、“值1”);
参数put(“键2”,2);
参数put(“键2”,3);


你能不能用一个映射(比如HashMap)来代替二维数组?由于数组和泛型不能很好地混合。如果它们是参数的键值对,一个简单的建议是包装您自己的键值对或使用Map的条目类型,然后将此类型用于您的数组。但我认为这并不像你希望的那么酷!或者确实是GJ13建议的hashmap,当然!你能不能用一个映射(比如HashMap)来代替二维数组?由于数组和泛型不能很好地混合。如果它们是参数的键值对,一个简单的建议是包装您自己的键值对或使用Map的条目类型,然后将此类型用于您的数组。但我认为这并不像你希望的那么酷!或者确实是GJ13建议的hashmap,当然!一个缺点:由于键没有以可靠的顺序返回,因此可能会为同一个应用程序生成不同的URL。@Carl除非您使用一个不可变的实现,该实现保留插入顺序(键和值)。一个缺点:由于键没有以可靠的顺序返回,因此可能会为同一个应用程序生成不同的URL。@Carl除非您使用一个不可变的实现,该实现保留插入顺序(键和值的插入顺序)。在Java中,唯一可以使用的类型是Object,以满足给定的示例值。在Java中,唯一可以使用的类型是Object,以满足给定的示例值。我使用的参数列表仅列出在一起以传递给buildParameter()。声明一个变量并进行多个put()调用,然后将该变量传递给函数,使其不再使用该结构,这看起来有些过分。而且如果我希望使用特定红色的键构造一个非常严格的URL,则HashMap不可能这样做。我使用的参数列表仅列出在一起以传递给buildParameter()。声明一个变量并进行多个put()调用,然后将该变量传递给函数,使其不再使用该结构,这看起来有些过分。而且如果我想要用特定红色的键构造一个非常严格的URL,那么HashMap就不可能做到这一点。这只比“Object[][]方法更详细一点,但会自行记录键/值对。是否有一种方法可以定义KeyItems[],这样项就可以嵌入到{}中,而不需要“new KeyEdItem()”对于每一对?@Carl,很遗憾,没有,但是您可以定义一个函数,将对象数组数组转换为
KeyedItem
对象数组。如果该类是另一个类的私有类,并且仅用于初始化,则还可以重命名该类以使用较短的名称。我假设buildParameters()已从对象[][]转换为对象[],因此我可以继续使用该方法或将您的类重命名为KV(键/值)。感谢您的回答和后续行动。这只比“Object[][]方法更详细一点,但会自行记录键/值对。是否有一种方法可以定义KeyItems[],以便在{}中嵌入项,而不需要为每一对添加“new KeyEdItem()”?@Carl不幸的是,没有,但您可以定义一个函数,将对象数组转换为
KeyedItem
对象数组。如果该类是另一个类的私有类,并且仅用于初始化,则还可以重命名该类以使用较短的名称。我假设buildParameters()已从对象[][]转换为对象[],因此我可以继续使用该方法或将您的类重命名为KV(键/值)。谢谢你的回答和跟进。