2

NodeType私はsとsの概念を持っていNodeます。ANodeTypeは、インスタンスを作成できる一連のメタデータですNode(クラスとオブジェクトの関係全体によく似ています)。

さまざまなNodeType実装とさまざまなノードの実装があります。

私のAbstractNodeType(NodeTypesのトップレベル)には、サブクラスによって実装されると、正しいNodeインスタンスを作成するababstractcreateInstance()メソッドがあります。

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()ますが、型の安全性についての警告を作成します。具体的には:

タイプの安全性:タイプThingTypeからのcreateInstance()の戻りタイプThingは、タイプAbstractNodeTypeからのTに準拠するために、チェックされていない変換が必要です。

そのような警告を引き起こすために私は何を間違っていますか?

これを修正するためにコードをリファクタリングするにはどうすればよいですか?

@SuppressWarnings("unchecked")良くありません。問題を無視せずに、正しくコーディングしてこれを修正したいと思います。

4

3 に答える 3

3

共変のリターン<T extends AbstractNode> Tの魔法のAbstractNodeおかげで、単に置き換えることができます。サポートを追加しましたが、それに値するパブを受け取りませんでした.Java 5

于 2008-09-17T10:17:40.403 に答える
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(...);
  }
}
于 2008-09-17T10:28:16.773 に答える
1

そのようなものはうまくいくはずです:

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();
    }
}
于 2008-09-17T10:25:13.787 に答える