Java 在将原语插入列表时,是否会出现编译或运行时错误?
以下代码有效:Java 在将原语插入列表时,是否会出现编译或运行时错误?,java,Java,以下代码有效: List list = new ArrayList(); list.add(1); 这是因为编译器会自动装箱/取消装箱。 我的问题是:在这种情况下,我是否能以某种方式得到编译(或运行时)错误 我已经试过了: 1) 返回原语的方法: int foo(){ return 2; } list.add(method()); 2) java 8中的匿名类: list.add(((Function) (ignored) -> 3).apply("")); UPD: 我们
List list = new ArrayList();
list.add(1);
这是因为编译器会自动装箱/取消装箱。我的问题是:在这种情况下,我是否能以某种方式得到编译(或运行时)错误 我已经试过了:
1) 返回原语的方法:
int foo(){
return 2;
}
list.add(method());
2) java 8中的匿名类:
list.add(((Function) (ignored) -> 3).apply(""));
UPD:我们可以将列表参数化为
列表
,甚至是列表
,结果将是相同的-这是工作。我的问题是“我怎样才能愚弄自动装箱机制?”你不会愚弄打字系统,但你总能愚弄代码的读者(不要在家里尝试)
类MyList实现列表{
// ...
@凌驾
公共空添加(整数值){
//调用实际实现
}
//超载
公共void add(int值){
抛出新的RuntimeException(“不允许自动装箱!”);
}
}
实现类似效果的另一种方法是创建自己的包装器类型,并将其用作列表参数:
public class IntValue {
public final int value;
public IntValue(int value) {
this.value = value;
}
}
// ...
List<IntValue> list = new ArrayList<>();
list.add(new IntValue(1)); // will compile
list.add(1); // won't compile
公共类IntValue{
公共最终整数值;
公共int值(int值){
这个值=值;
}
}
// ...
列表=新的ArrayList();
list.add(新的IntValue(1));//将编译
列表。添加(1);//不会编译
您无法愚弄编译器,它是Java语言规范。显然,可以使用一些代码检查工具,如PMD或findbugs,例如:也许你可以为它编写额外的自定义规则来检查你的具体情况。你想允许在列表中插入什么对象?你可以随时向列表添加任何内容。如果你使用泛型而不是泛型,那么至少你会得到一个错误,例如,一个列表
而不是列表
。(无论如何,您不应该使用原始类型,请参见链接)。int
是一个原语,它将自动装箱到Integer
中以进行此插入。因为JVM会尝试匹配add(int)
,但无法匹配,所以它会将其转换为Integer
来搜索add(Integer)
,这是可能的,因为您有一个列表,所以add(Object)
match愚弄自动装箱机制的唯一方法似乎是使用旧的java版本:毫无意义<代码>列表myList=新建myList();myList.add(2)
-oops@如果是,则只有在使用MyList list=new MyList()
时,它才会起作用。然而,这就是我理解OP-show问题的方式,在这种方式下,someList.add(1)
将失败。是的,但是强制使用MyList
并不是比问题中的问题更简单的问题。也就是说,现在不是禁止myList。添加(2)
你还需要禁止使用List
。你是对的,但老实说,我看不出使用myList
有任何实际好处。所以,我处理这个问题更像是一个编程难题。尽管如此,我还是在答案中增加了一个更实际的解决方案。
public class IntValue {
public final int value;
public IntValue(int value) {
this.value = value;
}
}
// ...
List<IntValue> list = new ArrayList<>();
list.add(new IntValue(1)); // will compile
list.add(1); // won't compile