【问题标题】:Casting an instance of a generic class into another whats the use?将泛型类的实例转换为另一个有什么用?
【发布时间】:2012-12-27 16:29:56
【问题描述】:

我知道这是可能的,但有什么用?因为它只能投射与被投射对象相同的类型?

class Example<X>{ 
//statements
}

//then this is declared
Example<Integer> x = new Example<Integer>();

//This is allowed
(Example<Integer>) x;

//this is not allowed, so what's the use?
(Example<Long>) x;

【问题讨论】:

  • 它不能编译,所以没有人可以使用它。我不明白你的问题。
  • 你可以做(Example&lt;Long&gt;)(Example) x。但这是愚蠢且容易出错的。你为什么要投给Example&lt;Long&gt;
  • @NikitaBeloglazov 好吧,我的书说它是可能的,但它没有给出具体的用途..所以我虽然我错过了一点
  • @vincentbelkin 你能在这里发布书中的确切报价吗?
  • 所以在泛型中你可以转换“左”部分(实际类)而不是“右”部分(类型类)。

标签: java generics types casting


【解决方案1】:

我在第一个中看到了一些用处。由于 java 在运行时决定类型,在这种特殊情况下,您可以将 x 声明为对象的实例,并通过在该行中向下转换它,您告诉编译器 x 确实是 Example。

我认为您的示例中不允许使用第二个,因为 Long 不是 Integer 的子类,更像是兄弟,因为我认为两者都继承自 Number。

查看文档:Long || Integer

所以,如果你做了类似的事情:

Example<Number> x = new Example<Number>();

(Example<Integer>) x;
(Example<Long>) x;

然后,如果您将 x 放到访问者之类的东西中,并且重载,您的 x 将落入您的 Example&lt;Long&gt; 实现而不是您的 Example&lt;Integer&gt; 实现。

我猜我在那里有点困惑,但希望它有所帮助。

【讨论】:

    【解决方案2】:

    这本书的引文并没有说你是通过例子来表达的。书中说,只要类型参数相同,您就可以简单地应用正常的转换规则。

    【讨论】:

      【解决方案3】:

      那有什么用呢?

      有很多用途。

      例如,用于将通配符参数转换为特定参数或更具体的通配符参数:

      Example<?> x;
      Example<? extends Number> y;
      Example<Integer> z;
      y = (Example<? extends Number>)x;
      z = (Example<Integer>)x;
      z = (Example<Integer>)y;
      

      或用于将实际类转换为更具体的类:

      Example<Integer> x;
      SubExample<Integer> y;
      y = (SubExample<Integer>)x;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        相关资源
        最近更新 更多