0

ツリー内のすべてのノードでデータのサイズを 2 倍にするメソッドを作成しています。私はそれを書くためのアルゴリズムを書き留めたと思いますが、ジェネリック型を2倍にする方法を理解するのに苦労しています.

したがって、基本的には、タイプ T のデータを取得して整数に変換し、それを 2 倍して、タイプ T として保存したいと考えています。これをどのように行うべきかについての助けは役に立ちます。他の情報が必要な場合はお知らせください。ありがとう。

4

2 に答える 2

1

タイプ eraserのため、これを直接行うことはできません。1 つのアプローチは、自分自身を 2 倍にする方法を「知っている」オブジェクトのジェネリック インターフェイスを定義することです。

public interface Doubler<T> {
    T doubled(T arg);
}

次に、各ノード (自分自身を倍増させる方法を知っている) にDoublerインターフェースを実装させることができます。

他のアプローチ (ファクトリ メソッド、ファクトリ オブジェクト、Class<T>インスタンスの受け渡しなど) も同様に (またはより良く) 機能する可能性があります。しかし、できないことの 1 つは、ジェネリック型だけを知っているコードでジェネリック型のインスタンスを作成することです。

于 2012-10-14T15:55:18.073 に答える
0

ジェネリック クラス / ツリー インスタンス / ジェネリック メソッドを宣言するときは、ジェネリック型パラメーター T を完全に制約なしのままにせずに、数値 (整数または浮動小数点数を処理する必要があるかどうかに応じて、Long または Double) にします。 :

それ以外の:

public class DoubleTree<T> {
    private TreeSet<T> myTree;
    public void doubleTree() {
         // ...
         for (T treeElement: myTree) {
               // no way to double element because 
               // "minimum guaranteed base type of T" is Object!!
         } 
    }
}

T extends Long最初の行でジェネリック型パラメーターとして試してください:

public class DoubleTree<T extends Long> {
    private TreeSet<T> myTree;
    public void doubleTree() {
         // ...
         for (T treeElement: myTree) {
               // Element has the Long interface - guaranteed
               T doubleIt = 2 * treeElement;

               // Note - you should really prevent numerical overflow in the above
               // e.g. if (treeElement < Long.MAX_VALUE / 2) {
               //            T doubleIt = 2 * treeElement; 
               //      } else { // Overflow error }
         } 
    }
}

一般性を高めるために、「Long」の代わりに「Number」を使用できます。しかし Number は抽象型であり、定数による乗算を直接サポートしていません! instanceof次のような方法で実行時に実際のクラスをチェックすることで、これを回避します。

if (treeElement instanceof Long) {
      Long doubleIt = 2 * treeElement.longValue();
} else if (treeElement instanceof Integer) {
      Integer doubleIt = 2 * treeElement.intValue();
} else if (treeElement isntanceof Float) {
      Float doubleIt = 2.0 * treeElement.floatValue();
} // ..... etc
于 2012-10-15T04:02:17.700 に答える