ツリー内のすべてのノードでデータのサイズを 2 倍にするメソッドを作成しています。私はそれを書くためのアルゴリズムを書き留めたと思いますが、ジェネリック型を2倍にする方法を理解するのに苦労しています.
したがって、基本的には、タイプ T のデータを取得して整数に変換し、それを 2 倍して、タイプ T として保存したいと考えています。これをどのように行うべきかについての助けは役に立ちます。他の情報が必要な場合はお知らせください。ありがとう。
タイプ eraserのため、これを直接行うことはできません。1 つのアプローチは、自分自身を 2 倍にする方法を「知っている」オブジェクトのジェネリック インターフェイスを定義することです。
public interface Doubler<T> {
T doubled(T arg);
}
次に、各ノード (自分自身を倍増させる方法を知っている) にDoubler
インターフェースを実装させることができます。
他のアプローチ (ファクトリ メソッド、ファクトリ オブジェクト、Class<T>
インスタンスの受け渡しなど) も同様に (またはより良く) 機能する可能性があります。しかし、できないことの 1 つは、ジェネリック型だけを知っているコードでジェネリック型のインスタンスを作成することです。
ジェネリック クラス / ツリー インスタンス / ジェネリック メソッドを宣言するときは、ジェネリック型パラメーター 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