当前位置: 首页 > 知识库问答 >
问题:

ClassCastException是System.out.Println

梁勇
2023-03-14
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,因为它可能不确定类型。我的问题是,如果它是典型的反对会不会更好。在这种情况下,它将调用toString()方法,代码将正常工作。这是Java编译器的问题还是我在这里遗漏了什么?

共有1个答案

逑俊楚
2023-03-14

其他答案中已经提到了问题的原因-classtype参数可以是实现TestInterface的任何类型,而不一定是T

这里有个解决办法。

当前的问题是classtype没有约束,如果没有足够的上下文,t就无法正确推断,从而导致obj被强制转换为错误的类型。所以如果我们把方法改为:

public <T extends testInterface> T getTheString(Class<T> classType){
System.out.println((testInterface)t.getTheString(implClass.class));

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

如果编译器不确定类型,为什么不类型强制转换为对象而不是字符串

编译器只能选择调用println的两个重载,因为其他重载都是基元类型。它可以是println(对象)println(字符串)。根据JLS(第15.12.2节):

 类似资料:
  • 问题内容: 当我调用并将其强制转换为该异常时。 抛出它的代码: 但是,并非每次都这样做。在大多数情况下,它运行正常,但在其他时候,它会抛出此异常。我不明白为什么会这样。我有什么办法可以阻止这种情况的发生? 问题答案: 您不应假定它是DefaultListModel。使用接口ListModel。JList返回ListModel的内部实现。 如果需要访问基础模型,则应创建它,在JList构造函数中进行

  • 我正在将Weblogic server从9升级到10.3.6。当我试图部署我的ear应用程序时,出现以下异常。 我尝试了各种各样的方法,包括添加一个weblogic应用程序.xml但它仍然不起作用。 我的weblogic.xml 这是我的pom.xml的一部分: 请帮帮忙。谢谢!

  • 我正在尝试创建一个“简单”的一个或多个或多个的关系。我得到以下例外情况: 有人能告诉我我做错了什么吗? 下面你可以找到我的两个实体。 提前谢谢你。 而且

  • 问题内容: 使用来反序列化参数化类的对象会导致的某些值,例如对于由和字段组成的简单类型: 有趣的是,当内联调用方法时,相同的代码也可以工作,即以下语句返回有效值: 的定义也很简单: 将方法更改为非静态不能解决问题。 有任何想法吗? 问题答案: 您想要我的解决方案是ParameterizedType 问题是T,因为Java不知道我的种类并生成T的类型 这是测试更多示例以纠正运行测试 testCont

  • 问题内容: 我正在尝试建立客户端jar文件来访问Web服务。我将jar包含在进行客户端Web服务调用的servlet / war中。我收到以下错误: 我碰到了这个帖子http://yaytay.wordpress.com/2010/03/06/lsned-29-persuading-jdk-6-to- use-cxf-classes-rather-than-its-own-avoiding-sei

  • 我需要创建自己的UnaryTransformer实例,该实例接受类型为Array[String]的Dataframe列,并且还应该输出相同的类型。在尝试这样做时,我在Spark版本2.1.0上遇到了ClassCastException。我做了一个样本测试来证明我的情况。 附加堆栈跟踪以供参考