【问题标题】:Java generic castingJava 泛型转换
【发布时间】:2016-08-16 10:55:37
【问题描述】:

我有一个泛型类 A<T> 和一个子类 B 扩展 A<String>。 类 A 有一个返回 this 的方法(所以是 A<T>)。 问题是,如果我在 B 对象上调用该方法,它将返回 A<String>,我必须强制转换为 B,但 B 与 A<String> 相同,不是吗?所以我不应该投...

【问题讨论】:

标签: java generics types casting


【解决方案1】:

如果您的方法返回A<String>,它可以B类型的对象但不一定是!

如果您有 carBMW extends car 类型的超类。

假设有一家制造汽车的工厂。 该方法返回汽车 - 这可以是宝马,但不一定是宝马

【讨论】:

  • 因为我可以创建另一个也扩展 A 的类,所以我只有一个,所以我没有看到...
  • @L.DUPRÉBERTONI 这并不是问题的真正答案,它有一个很好的解决方案。如果我知道我有一个B,并且超类中的一个方法返回this,那么我希望它返回一个B;但该方法实际上会返回一个A<String>。解决这个问题的方法是奇怪地重复出现的模板模式。
  • @BoristheSpider 问题是关于理解为什么他必须投 - 我想我清楚地回答了这个问题。如果您发现自己有其他问题,请随时将其发布为他的问题的答案
  • 重点是“[t]他的类A有一个返回this的方法”。如果已经创建了new B(),那么我们就知道this 永远不可能通过其他任何东西。这个答案回答了一个不同的问题,而不是提出的问题。我相信OP并没有真正理解这个问题,并且选择了错误的答案......
【解决方案2】:

我重写了该方法并转换了返回值,这样我就不必在任何地方都这样做了。谢谢@AndyTurner

【讨论】:

    【解决方案3】:

    您甚至不必投射。您可以重写该方法并将返回类型更改为 B,因为它仍然是 A<String>,即 A<T>,因此它对 B 有效。

    class A<T> {
    
        public A<T> return_this() {
            return this;
        }
    
    }
    
    class B extends A<String> {
    
        @Override
        public B return_this() {
            return this;
        }
    
    
    }
    

    所以你可以这样做:

    B b = new B();
    A<String> a = b.return_this(); //Because B extends A<String>
    B b = b.return_this();
    

    【讨论】:

    • 这确实有效,但如果有大量方法,很快就会变得站不住脚。
    • 你可以这样做,也可以在每次调用方法时进行强制转换。
    • 正如我所说,这取决于。当您在层次结构中有一两个方法和一两个类时,此解决方案很简单并且有效。如果有大量方法返回 self 类型,它将变得不可维护;例如在流利的访问器或构建器模式中。在这种情况下,需要奇怪地重复出现的模板模式。然而,铸造从来都不是一种选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多