public class Example {
public static <T> void f(T obj) {
Integer i = (Integer) obj; // runtime error
}
public static void main(String[] args) {
f("hello");
}
}
List<String> ls = new ArrayList<>();
ls.add(42); // compile-time error
ls.add("foo");
Integer i = ls.get(0); // compile-time error
如果答案是“编译器只是不够聪明”,那么(向后兼容?)为什么不能让它变得更聪明?
Java基于其当前的规则集(参见JLS)必须分别处理方法内容和调用站点。
演员阵容
(Integer) obj
必须在编译时允许,因为t
可以是整数
。毕竟,像这样的电话
f(4)
House a = new House();
Dog b = (Dog) a;
总而言之,您必须向Java语言设计人员询问决策过程中的确切原因。它就是它的本来面目。
这里通常是静态代码分析器的工作(就像大多数IDE已经包含的那样)。他们实际上会扫描您的代码,所有的用法等等,并试图弄清楚您当前的代码流是否存在可能的问题。
需要注意的是,这也包括了大量的误报,因为我们刚刚了解到,并不是所有的这种用法实际上都是错误的,有些危险的设置可能是有意的。
所以tldr是,几乎所有真实的代码情况都需要更多的努力,一个工具才能100%地证明调用是不正确的。此外,对其进行编程要困难得多,而且不能始终确保没有误报。这就是为什么这些东西通常不是由编译器而是由静态代码分析器来完成的原因。
这方面的两个常见示例是方法嵌套和代码分支。
假设您在另一个方法中隐藏cast(Integer)obj
一个level depper:
public static void main(String[] args) {
f("hello");
}
public static <T> void f(T obj) {
g(obj);
}
public static <T> void g(T obj) {
Integer i = (Integer) obj;
}
public static void main(String[] args) {
f("hello");
}
public static <T> void f(T obj) {
if (isMonday()) {
Integer a = (Integer) obj;
} else {
String b = (String) obj;
}
}
问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S
我正在尝试初始化菜单上的自定义搜索工具(3d库),但我得到了错误。 但这无助于第136行对应于 菜单的xml
我正在尝试在RecyclerView中添加搜索过滤功能。但应用程序因以下错误而崩溃: 科特林。TypeCastException:null不能转换为非null类型kotlin。收藏。请登录com。卡贝拉什。电影。用户界面。PostListAdapter$searchFilter$1。在android上发布结果(PostListAdapter.kt:87)。小装置。筛选$ResultsHandler
当涉及到变量函数时,为什么参数会被提升,例如浮点被提升为双ext,以及它们的提升顺序是什么? 可变参数-cppreference.com 当调用变量函数时,在左值到右值、数组到指针和函数到指针的转换之后,作为变量参数列表一部分的每个参数都会经历额外的转换,称为默认参数提升: std::nullptr_t转换为无效* 浮点参数转换为浮点提升中的双精度 bool、char、短枚举和非作用域枚举被转换为
问题内容: 我无法理解Xcode在此行面临的问题: 是一个和和是第。Xcode用以下消息突出显示方括号: 下标’subscript(_ :)’要求类型’Substring.Index’和’Int’是等效的 错误消息对我来说没有任何意义。我尝试通过创建带有下标的来获得。这有什么关系?为什么相同的模式在其他地方也起作用? Xcode操场代码重现该问题: 毕竟,我有一个模板字符串和它的两个子字符串。
我为JavaFX TableColumn创建了一个扩展函数,使得在没有重复样板的情况下实现cellFactory更加简洁。扩展函数定义如下: 为了格式化TableCell,我只需要定义TableCell中应该发生什么。当当前单元格有非空项可用时更新项。例如,要格式化LocalDateTime,我现在可以编写: 然后我继续定义另一个扩展来执行此操作,因此我可以编写: 此函数使用第一个函数,如下所示: