gpt4 book ai didi

java - 不清楚的编译时 Java 错误

转载 作者:行者123 更新时间:2023-12-03 22:54:05 24 4
gpt4 key购买 nike

我在编译时错误方面遇到了以下代码的特殊行为(我使用的是 JDK7):

public class classA { public void foo( List<Object> o ){} }

public class classB<T>{ public void bar( List<Object> o ){} }

我们考虑以下测试对象

List<String> o = new ArrayList<String>();

通过将 o 作为参数传递给类 classA 的方法 foo 是无法让 java 编译的,而且到目前为止据我所知,不应该有。

现在假设我们在 classB 的 main 方法中并尝试只调用 bar 而不实例化 classB 的实例来调用它。我可能希望得到一个 无法从静态上下文调用非静态方法 编译错误,就像我试图在 classA 中提取它一样,但我得到了一个转换调用错误。这是有道理的 - 类型不一致。

但是如果我尝试从非静态上下文中调用 bar,如

ClassB b = new classB(); 
b.bar( o );

Java似乎原谅我没有把类型排好,运行代码没问题。我没有做任何事情来解决打字转换问题,那么为什么 Java 让这段代码执行,而 classA 则不会?

编辑:回答一些问题。 classA 仅供引用 - 它不应该编译,我也不希望它编译,所以我不能提供用它编译的代码。确实编译和执行的 classB 代码可能由以下方式给出:

public class classB<T> {
public void bar( List<Object> o ){}

public static void main( String[] args ){
classB b = new classB();
List<String> o = new ArrayList<String>();
b.bar( o );
}

}

此代码编译并执行。类声明行中没有通用声明的完全相同的代码 不起作用。我理解类型删除,有人逃避了,但它有什么帮助,因为 T 不是方法栏或主代码中的引用

此外,还有很多方法可以让这段代码变得更好。我真的只是在寻找对其行为的解释

最佳答案

这是泛型实现方式的限制。

他们选择加入。

classB b = new classB();

在这里,您选择退出泛型,并且会收到警告。

Note: classB.java uses unchecked or unsafe operations.

当您选择退出泛型类型检查时,对于整个类,即使对于不使用绑定(bind)类型的方法,您也不会得到任何检查 T .

正如@vandale 指出的那样,在关闭泛型的情况下,您甚至可以使用以下代码编译代码

 public void bar( List<Float> o );  

如果你做一个

classB<Object> b = new classB<Object>();

它将不再编译。

关于java - 不清楚的编译时 Java 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19149838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com