Collection<String>=new ArrayList<>();这样子会什么会报错
时间: 2024-04-15 14:27:16 浏览: 229
在Java中,`ArrayList`是`List`接口的一个实现类,而`Collection`是`List`接口的父接口。因此,你可以将`ArrayList`赋值给`Collection`类型的变量,例如:
```java
Collection<String> collection = new ArrayList<>();
```
这样的赋值是合法的,不会报错。但是,如果你将`ArrayList`赋值给一个泛型声明为`Collection<String>`的变量,会出现编译错误。
```java
Collection<String> collection = new ArrayList<>(); // 正确
Collection<String> collection = new ArrayList<String>(); // 也可以
```
但如果你使用了Diamond Operator (`<>`),在Java 7之前是不允许的,会导致编译错误。要解决这个问题,你可以将代码修改为以下形式:
```java
Collection<String> collection = new ArrayList<String>();
```
或者直接使用Diamond Operator:
```java
Collection<String> collection = new ArrayList<>();
```
总结起来,将 `Collection<String>` 赋值为 `new ArrayList<>()` 是合法的,不会报错。
相关问题
Error:(32, 17) java: 对于invokeAll(ss), 找不到合适的方法 方法 java.util.concurrent.ExecutorService.<T>invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>)不适用 (无法推断类型变量 T (参数不匹配; ss无法转换为java.util.Collection<? extends java.util.concurrent.Callable<T>>)) 方法 java.util.concurrent.ExecutorService.<T>invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>,long,java.util.concurrent.TimeUnit)不适用 (无法推断类型变量 T (实际参数列表和形式参数列表长度不同))
这个报错信息提示在第32行中的invokeAll方法调用参数不匹配,无法找到合适的方法。可能有两个问题:
1. ss类没有实现Callable接口,导致无法将其转换为Callable类型的集合,所以参数不匹配。
2. invokeAll方法需要传入一个Callable的集合,而你只传入了一个ss对象,和一个ss类型的集合也无法匹配,所以报错。
你可以将ss改为实现Callable接口,然后将其放入一个Callable类型的集合中,再将集合传入invokeAll方法中。代码示例如下:
```
public class test {
public static void main(String[] args) throws InterruptedException {
// 创建一个固定大小的线程池
ExecutorService service = Executors.newFixedThreadPool(3);
Callable<String> t1 = new ss();
List<Callable<String>> list = new ArrayList<>();
list.add(t1);
service.invokeAll(list);
// 关闭启动线程
service.shutdown();
// 等待子线程结束,再继续执行下面的代码
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
//System.out.println("all thread complete");
}
}
class ss implements Callable<String> {
@Override
public String call() {
System.out.println(Thread.currentThread().getName() + "执行call方法");
return null;
}
}
```
这样就可以避免参数不匹配的问题了。
struts从2.3.15升级到2.5.30后,action接收的list数组被限制最大只接收256,调试过程中无报错,用postman调接口后,传参数组大小为259,但是传到后台后数组大小只有256
在Struts2中,接收参数时被限制为最大只接收256长度的原因是因为Struts2默认使用的是ArrayList类型的TypeConverter进行参数类型转换,而该TypeConverter默认的最大值为256。
要解决这个问题,可以自定义一个TypeConverter,并替换掉Struts2默认的ArrayList类型的TypeConverter。具体步骤如下:
1. 自定义一个TypeConverter,继承自StrutsTypeConverter类,并重写convertFromString方法,如下所示:
```java
import java.util.ArrayList;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class MyArrayListConverter extends DefaultTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
if (values == null || values.length == 0) {
return null;
}
ArrayList<Object> list = new ArrayList<Object>();
for (String value : values) {
list.add(value);
}
return list;
}
}
```
2. 在struts.xml文件中注册该TypeConverter,并指定需要转换的参数类型,如下所示:
```xml
<bean type="org.apache.struts2.util.StrutsTypeConverter" name="myArrayListConverter" class="com.example.MyArrayListConverter"/>
<constant name="struts.conversion.array.maxSize" value="1000" />
<constant name="struts.conversion.array.allowNonList" value="true" />
<constant name="struts.conversion.collection.maxSize" value="1000" />
<constant name="struts.conversion.map.maxSize" value="1000" />
<constant name="struts.conversion.object.maxSize" value="1000" />
<constant name="struts.conversion.properties.maxSize" value="1000" />
<constant name="struts.conversion.date" value="false" />
<constant name="struts.conversion.number" value="false" />
<constant name="struts.conversion.boolean" value="false" />
<constant name="struts.conversion.class" value="false" />
<constant name="struts.conversion.fileUpload" value="false" />
<constant name="struts.conversion.patternMatcher" value="false" />
<constant name="struts.conversion.locale" value="false" />
<constant name="struts.conversion.classloader" value="false" />
<constant name="struts.conversion.enum" value="false" />
<constant name="struts.conversion.i18n" value="false" />
<constant name="struts.conversion.numberLocale" value="false" />
<constant name="struts.conversion.dateLocale" value="false" />
<constant name="struts.conversion.string" value="false" />
<constant name="struts.conversion.classArray" value="false" />
<constant name="struts.conversion.dateArray" value="false" />
<constant name="struts.conversion.numberArray" value="false" />
<constant name="struts.conversion.booleanArray" value="false" />
<constant name="struts.conversion.enumArray" value="false" />
<constant name="struts.conversion.i18nArray" value="false" />
<constant name="struts.conversion.patternMatcherArray" value="false" />
<constant name="struts.conversion.fileUploadArray" value="false" />
<constant name="struts.conversion.propertiesArray" value="false" />
<constant name="struts.conversion.collectionArray" value="false" />
```
在上述代码中,我们使用了常量struts.conversion.array.maxSize来指定了最大值为1000,这个值可以根据具体情况进行修改。同时,我们也可以通过其他常量来指定其他类型的最大值。
3. 在action中将需要转换的参数指定为该TypeConverter,如下所示:
```java
public class MyAction extends ActionSupport {
private ArrayList<Object> list;
public ArrayList<Object> getList() {
return list;
}
public void setList(ArrayList<Object> list) {
this.list = list;
}
@Override
public String execute() throws Exception {
// do something
return SUCCESS;
}
@Override
public void validate() {
if (list != null && list.size() > 1000) {
addFieldError("list", "列表长度不能超过1000");
}
}
@Override
public void prepare() throws Exception {
// 注册TypeConverter
ConvertUtils.register(new MyArrayListConverter(), ArrayList.class);
}
}
```
在上述代码中,我们将需要转换的参数list指定为自定义的TypeConverter,在prepare方法中注册TypeConverter。同时,在validate方法中可以对list的大小进行验证,以避免超过指定的大小。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)