【发布时间】:2017-01-11 17:05:05
【问题描述】:
如果我在 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 编译器的问题还是我在这里遗漏了什么?
【问题讨论】:
-
有趣;并且没有初步的想法;但除了实际问题:Java 中的类名以大写字母开头;偏离该标准会使您的代码更难为所有人阅读。此外:请使用预览功能并花时间正确格式化/缩进您的源代码所有!