【问题标题】:Generic Method Type Safety通用方法类型安全
【发布时间】:2008-09-17 10:14:32
【问题描述】:

我有NodeTypes 和Nodes 的概念。 NodeType 是一堆元数据,您可以从中创建 Node 实例(很像整个类/对象关系)。

我有各种 NodeType 实现和各种 Node 实现。

在我的 AbstractNodeType(NodeTypes 的顶层)中,我有一个抽象的 createInstance() 方法,一旦由子类实现,它就会创建正确的 Node 实例:

public abstract class AbstractNodeType {
  // ..

  public abstract <T extends AbstractNode> T createInstance();
}

在我的NodeType 实现中,我实现了这样的方法:

public class ThingType {
  // ..

  public Thing createInstance() {
    return new Thing(/* .. */);
  }
}

// FYI
public class Thing extends AbstractNode { /* .. */ }

这一切都很好,但是public Thing createInstance() 创建了一个关于类型安全的警告。具体来说:

类型安全:返回类型 Thing createInstance() 从类型 ThingType 需要未经检查的转换 从类型符合 T 抽象节点类型

我做错了什么导致这样的警告?

如何重构我的代码来解决这个问题?

@SuppressWarnings("unchecked") 不好,我希望通过正确编码来解决这个问题,而不是忽略问题!

【问题讨论】:

    标签: java generics


    【解决方案1】:

    由于covariant returns 的魔力,您可以将&lt;T extends AbstractNode&gt; T 替换为AbstractNodeJava 5 增加了支持,但它没有收到应得的 pub。

    【讨论】:

    • 天哪,这太酷了。你说得对,它真的没有得到它应得的酒吧!
    • 是的,这是我从那本愚蠢的 SCJP 书中得到的唯一有价值的东西。
    【解决方案2】:

    两种方式:

    (a) 不要使用泛型。在这种情况下可能没有必要。 (尽管这取决于您未显示的代码。)

    (b) 生成 AbstractNodeType 如下:

    public abstract class AbstractNodeType<T extends AbstractNode> {
      public abstract T createInstance();
    }
    public class ThingType<Thing> {
      public Thing createInstance() {
        return new Thing(...);
      }
    }
    

    【讨论】:

      【解决方案3】:

      类似的东西应该可以工作:

      interface Node{
      }
      interface NodeType<T extends Node>{
          T createInstance();
      }
      class Thing implements Node{}
      class ThingType implements NodeType<Thing>{
          public Thing createInstance() {
              return new Thing();
          }
      }
      class UberThing extends Thing{}
      class UberThingType extends ThingType{
          @Override
          public UberThing createInstance() {
              return new UberThing();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        • 2012-05-24
        • 1970-01-01
        • 2019-07-15
        • 2012-12-13
        相关资源
        最近更新 更多