Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在将原语插入列表时,是否会出现编译或运行时错误?_Java - Fatal编程技术网

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