6

为什么会这样?代码中的一行运行良好,而另一类似行则不行。自动类型转换是否仅在某些条件下发生?我试图将 gt.echoV() 分配给一个对象,并且效果很好;但是当我将它分配给一个字符串时,同样的错误会再次出现。

public class GeneMethodTest {

    public static void main(String... args) {
        GeneMethodTest gt = new GeneMethodTest();
        gt.<String>echoV(); //this line works well
        gt.<String>echoV().getClass();//this line leads to a type cast exception                                                          
    }

    public <T> T echoV() {
        T t=(T)(new Object());                                                                    
        return t;
    }
}
4

3 回答 3

4

gt.<String>echoV().getClass();产生以下操作序列的等价物:

// Inside echoV
Object t = new Object();  // Note that this is NOT a String!
Object returnValue = t;
// In main
String stackTemp = (String) returnValue;  // This is the operation that fails
stackTemp.getClass();

使用泛型“免费”获得的是(String)演员阵容。没有其他的。

于 2013-07-31T22:57:44.873 回答
2

这很完美,没什么特别的,泛型的正常使用

gt.<String>echoV(); //this line works well

这里有一些不太明显的东西。因为泛型方法是在运行时定义的,jvm 不知道泛型方法将在编译时返回什么样的类,因此 classTypeException

gt.<String>echoV().getClass();//this line leads to a type cast exception   

你应该首先将它分配给一个变量,因为 jvm 在编译时确实知道变量的类型

String s = gt.<String>echoV();
s.getClass();
于 2013-07-31T18:54:57.727 回答
1

改变这一行:

gt.<String>echoV().getClass();

至:

(gt.echoV()).getClass();

它会编译
(它会返回: class java.lang.Object

的根源ClassCastException是该方法返回t(泛型类型T是一个对象)并且您尝试将其向下转换为字符串。您还可以更改代码以返回:

return (T)"some-string";

为了消除错误。

编译器使用泛型来检查预期的对象类型,因此它可以捕获开发人员在编译时犯的错误(与运行时错误相比)。所以恕我直言,这种使用泛型的方式达到了目的。

于 2013-07-31T18:56:40.430 回答