gpt4 book ai didi

java - ClassCastException 是 System.out.println

转载 作者:行者123 更新时间:2023-11-30 07:57:05 24 4
gpt4 key购买 nike

如果我在 System.out.println() 中直接使用 t.getTheString(implClass.class) 的返回对象,下面的代码将抛出 java.lang.ClassCastException。虽然当我将对象分配给某个引用时,它工作正常,为什么?

interface testInterface{

public String testMethod();
}
class testClass{

public <T extends testInterface> T getTheString(Class< ? extends testInterface> classType){
try {
testInterface obj = classType.newInstance();
return (T)obj;
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}

class implClass implements testInterface{

@Override
public String testMethod() {

return "Sample String";
}

@Override
public String toString(){
return super.toString() + " Overridden toString()";

}

}
public class genericTest {

public static void main(String args[]){
testClass t = new testClass();
testInterface ti = t.getTheString(implClass.class);
implClass i = t.getTheString(implClass.class);
//System.out.println(i); //<= Works fine
//System.out.println(ti); //<= Works fine
System.out.println(t.getTheString(implClass.class)); // Exception in thread "main" java.lang.ClassCastException: implClass cannot be cast to java.lang.String

}

}

编辑:许多人对这个问题感到困惑。上界的使用只是为了创建这个例子。我知道这是不正确的。怀疑是,如果你反编译上面的代码,你会看到编译器将 t.getTheString(implClass.class) 结果类型转换为 String,因为它可能不确定类型。我的问题是,如果将其类型转换为 Object 会不会更好。在这种情况下,它将调用 toString() 方法,代码将正常工作。这是 Java 编译器的问题还是我在这里遗漏了什么?

最佳答案

问题的原因已经在其他答案中提到了——你的classType参数可以是任何实现了testInterface的类型,不一定是T .

这是一个解决方案。

目前的问题是classType没有约束,没有足够的上下文,无法正确推断T,导致obj被强制转换到错误的类型。因此,如果我们将方法更改为:

public <T extends testInterface> T getTheString(Class<T> classType){

T 每次都可以从参数中正确推断出来!

另一个解决方案是用你想要的类型填入编译器:

System.out.println((testInterface)t.getTheString(implClass.class));

从您的评论到另一个答案:

If compiler is uncertain about the type why not type cast it to Object instead of String

println 只有两个重载可供编译器选择调用,因为其他都是原始类型。它是 println(Object)println(String)。根据 JLS(第 15.12.2 节):

This step uses the name of the method and the types of the argument expressions to locate methods that are both accessible and applicable There may be more than one such method, in which case the most specific one is chosen.

参见 this post了解更多信息。

由于String比Object更具体,所以选择后者。

关于java - ClassCastException 是 System.out.println,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41584836/

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