Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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,我在一些旧代码中发现了一个bug,它显然永远不会工作。但是,它是一个运行时异常,而不是编译时异常。我把我的自定义类换成了标准Java类,得到了一个编译错误 导致一个为未检查强制转换(运行时异常)而另一个为不可转换类型(编译异常)的区别是什么 GenTest.java import java.util.Collection; import java.util.Optional; public class GenTest { public static void main(String[]

我在一些旧代码中发现了一个bug,它显然永远不会工作。但是,它是一个运行时异常,而不是编译时异常。我把我的自定义类换成了标准Java类,得到了一个编译错误

导致一个为未检查强制转换(运行时异常)而另一个为不可转换类型(编译异常)的区别是什么

GenTest.java

import java.util.Collection;
import java.util.Optional;

public class GenTest {
    public static void main(String[] args) {
        try {
            MyClass<Integer> a = new MyClass<>(10);
            // This generates a warning but compiles, then fails at runtime
            Collection<MyClass<Integer>> runtimeFail = (Collection<MyClass<Integer>>) a;
        } catch (ClassCastException cce) {
            cce.printStackTrace();
            System.out.println("encountered expected runtime error");
        }

        Optional<Integer> b = Optional.of(10);
        // This generates a compile time exception
        //Collection<Optional<Integer>> compileFail = (Collection<Optional<Integer>>) b;
    }
}
public class MyClass<T> {
    T value;

    public MyClass(T value) {
        this.value = value;
    }
}
import java.util.Collection;
导入java.util.Optional;
公共阶层绅士{
公共静态void main(字符串[]args){
试一试{
MyClass a=新MyClass(10);
//这会生成警告,但会编译,然后在运行时失败
集合runtimemail=(集合)a;
}捕获(ClassCastException cce){
cce.printStackTrace();
System.out.println(“遇到预期的运行时错误”);
}
可选b=可选。共(10);
//这将生成编译时异常
//集合compileFail=(集合)b;
}
}
MyClass.java

import java.util.Collection;
import java.util.Optional;

public class GenTest {
    public static void main(String[] args) {
        try {
            MyClass<Integer> a = new MyClass<>(10);
            // This generates a warning but compiles, then fails at runtime
            Collection<MyClass<Integer>> runtimeFail = (Collection<MyClass<Integer>>) a;
        } catch (ClassCastException cce) {
            cce.printStackTrace();
            System.out.println("encountered expected runtime error");
        }

        Optional<Integer> b = Optional.of(10);
        // This generates a compile time exception
        //Collection<Optional<Integer>> compileFail = (Collection<Optional<Integer>>) b;
    }
}
public class MyClass<T> {
    T value;

    public MyClass(T value) {
        this.value = value;
    }
}
公共类MyClass{
T值;
公共MyClass(T值){
这个值=值;
}
}

汤姆给我指了指回答问题的副本,参见

为了重新散列,我将MyClass更改为final,它给出了一个编译时错误。选修课也是最后一门课


谢谢

您知道
可选
的内容吗?您确定
新可选(10)
为您编译了吗?因为我希望你想做研究:检查一下,
Optional
final
这一点很重要,而你的类不是。dupe的可能复制使用不同的类,但答案解释了这里发生的事情。Optional的子类不能是集合,因为Optional是
final
。试着让你的课程成为最后一个如果你发现这是重复的,不要回答这个问题。改为接受副本(问题上方应有通知)。