2

次のようなジェネリックを使用してクラスを実装しています。

public abstract class AbstractTask<T,V>
{
  public void method1 (T param1, V param2) {}
}

宣言<T,K>を変数にすることはできますか? この方法でそのクラスを拡張したいと思います:

public class TaskOne extends AbstractTask<Integer,String>
{
  public void method1 (Integer param1, String param2) {}
}

public class TaskTwo extends AbstractTask<Number,Object,Double>
{
  public void method1 (Number param1, Object param2, Double param3) {}
}

これを行うことは可能ですか?

ありがとう

4

3 に答える 3

2

いいえ、できません。

Vパラメータのプレーンjava.langタイプからラッパーに変更する必要があります。

public class TaskOne extends AbstractTask<Integer,StringWrapper>
{
  public void method1 (Integer param1, StringWrapper param2) {}
}

public class TaskTwo extends AbstractTask<Number,ObjectAndDoubleWrapper>
{
  public void method1 (Number param1, ObjectAndDoubleWrapper param3) {}
}

class ObjectAndDoubleWrapper {
    Object obj;
    Double doub;
}

明らかに、解決しようとしている問題を反映した、より適切な名前を選択してください。

于 2012-12-18T13:29:17.217 に答える
0

いいえ、それは不可能です。Java コンパイラはジェネリックを強制し、コンパイル エラーが発生します。

于 2012-12-18T13:28:20.677 に答える
0

いいえ、型とメソッドのパラメーターの数は、ジェネリック クラスのすべてのインスタンスで同じでなければなりません。

あなたが達成しようとしていることを知っていれば、代替案を提案するかもしれません。たとえば、タスクをスレッド プールにサブミットする場合は、次のようにすることができます。

final int x = ...;
final String y = ...;
final Number n = ...;
new Runnable {
    @Override public void run() {
        // do something with x, y and n
    }
}

または、AOP プロキシを使用してパラメーターをキャプチャすることもできます。

または(型の安全性が必要ない場合)、単に

void method1(Object... args);

または ...

于 2012-12-18T13:40:27.210 に答える