1

私には2つの非常によく似た方法があり、それらを(ジェネリックスの助けを借りて)マージしたいと思います。ただし、リターンタイプは異なります。私に何ができる?

    public static <A, B> A veggie(MyList <Box<A, B>> b, int j) {

        A veggieA = b.head.first;
        return veggieA;
    }

    public static <A, B> B veggie2(MyList <Box<A, B>> b, int j) {

        B veggieB = b.head.second;
        return veggieB;
    }
4

6 に答える 6

1

Java 7 では、戻り値の型だけでは区別できません。Java 6 にはバグがあり、これを行うことができましたが、使用することはお勧めしません。

Objectこれは、戻り値の型を作成したり、チェックされていないキャストを実行したりしないとマージできないことを意味しますが、これはお勧めできません。

あなたの例では、メソッド名を異なるものにして、最初または2番目のメソッドを取得することが明らかです。

于 2013-01-10T11:51:17.393 に答える
0

同じ名前と同じパラメーターを持つ2つのメソッドを持つことはできません。

メソッドのオーバーロードを参照してください。

Javaオーバーロードルール

Javaのオーバーロードと継承のルール

于 2013-01-10T11:49:58.293 に答える
0
  • X または Y のいずれかが他方のスーパータイプでない限り、メソッドが型 X または型 Y を返すことができると宣言することはできません (この場合、他のサブタイプも返される可能性があります)。
  • 戻り値の型だけが異なる 2 つのメソッドを宣言することはできません
于 2013-01-10T11:50:49.317 に答える
0

メソッドの戻り値の型を、 と の両方で使用される共通のクラスに変更できAますB。ただし、ABextendの両方を使用すると、次のBaseように使用できます。

public static BaseClass veggie(MyList <Box<A, B>> b, int j) {
    BaseClass veggie;
    // Do things
    return veggie;
}

両方の方法をマージしたいので、AいくつBかの共通点があると思います。そうでない場合は、Objectクラスを戻り値の型として使用できます。

于 2013-01-10T11:51:24.570 に答える
0

メソッドの戻り値の型を object に変更します。演算子を使用instanceofすると、区別できます。

public static Object veggie(MyList <Box<A, B>> b, int j) {
    if(some_condition){
        A veggieA = b.head.first;
        return veggieA;
    }else{
        B veggieB = b.head.second;
        return veggieB;
    }
}

.
.
.

Object  obj=veggie(b,j);
if (obj instanceof <A, B> A) {
    do something    
else{
    do something
}
于 2013-01-10T12:20:48.590 に答える
0

この場合、クラス A と B は同じインターフェース (例えば C) を実装する必要があります。A と B が C を実装する場合、次のように記述できます。

public static <C, A extends C, B extends C> C veggie1(MyList <Box<A, B>> b, int j) {
  C veggieA = b.head.first;
  return veggieA;
}

public static <C, A extends C, B extends C> C veggie2(MyList <Box<A, B>> b, int j) {
  C veggieB = b.head.second;
  return veggieB;
}

したがって、それらを今すぐマージしたい場合は、1 番目または 2 番目のどちらが必要かを指定するパラメーターをメソッドに渡す必要があります。

例えば:

public static <C, A extends C, B extends C> C veggie(MyList <Box<A, B>> b, int j, boolean first) {
  C veggie;
  if (first) 
    veggie = b.head.first;
  else 
    veggie = b.head.second;
  return veggie;
}
于 2013-01-10T13:11:20.387 に答える