0

たとえば、次のような一般的な方法があります。

public static<T> T execute(...) {
    ...
}

メソッド本体で T の型を定義するにはどうすればよいですか? 例えば:

if (T == String) {
  // do something with strings
  // return string;
}
if (T == Bitmap) {
  // do something with bitmap
  // return bitmap;
}

次のことを試しましたが、うまくいきませんでした。

T par = null;
if(par instanceof String) {
    // do something with strings
    // return string;
}

以下のように宣言しようとしparましたが、それもうまくいきませんでした。

T par = (T) null;
T par = (T) new Object();
4

4 に答える 4

2

おそらく次のようなことができます:

public static <T>  T execute(Class<T> t) {
    if(String.class == t) {

    }
}
于 2012-06-29T17:18:46.920 に答える
1

コードが個別のデータ型セットのみをサポートしている場合は、ジェネリックを使用したくありません。元の投稿のコメントで述べたように、この状況ではオーバーロードされたメソッド呼び出しが必要です。

たとえば、文字列、整数、および倍精度浮動小数点数をサポートしているが、他のデータ型に対する特定のロジックがない状況を考えてみましょう。次のようなメソッドを定義します。

public static String execute(String s) { ... }
public static Integer execute(Integer i) { ... }
public static Double execute(Double d) { ... }
public static Object execute(Object o) { ... }

最初の 3 つのメソッドは、サポートする 3 つの個別のデータ型のロジックを定義しますが、最後のメソッドは、サポートしないその他のデータ型のロジックやエラー処理を定義します(もちろん、これは int 型または double 型ではないプリミティブをカバーしていませんが、これは単なる例です。)

ジェネリクスは最初に Java に追加され、含まれているものを正確に把握するコレクションをサポートしました。List<String>たとえば、リストを と宣言することで、リストが文字列のみを保持することを保証する方法でした。その後、この機能は拡張されましたが、基本的な概念は保持されていました。型 X の未知のオブジェクトを入れた場合、コンパイル時に X が何であるかがわからなくても、同じ型 X を取得するためのロジックを記述できることを保証します。アウト。(この記事は、古くなっている場合でも、興味深い読み物です。)

これは、メソッドまたはクラスに適用されるロジックが入力のデータ型に依存する場合に使用する必要があるという意味ではありません。入力データ型が問題ならない場合に使用する必要があり、不明なデータ型 X に対して一貫して同じロジックが適用されます。

tl;dr: 元の投稿では、入力パラメーターのデータ型に基づいて異なるロジックが示されていたため、ジェネリックを使用するのは適切ではありません。execute代わりに、サポートされているデータ型に基づくメソッドのオーバーロードを使用する必要があります。

于 2012-06-29T17:36:24.970 に答える
0

コード内の機能を既にそのように分割しており、入力が同じである場合は、おそらく異なる機能で十分に機能するでしょう。その代わりに(ジェシュルンの答えを使用)

public static <T>  T execute(Class<T> t) 
{
  if(String.class == t) {

  }
}

BitMap b = execute(BitMap.class);

あなたが持っているだろう

public BitMap bitmapExecute(...)
{
  commonWork();
  //do bitmap stuff
}

public String stringExecute(...)
{
  commonWork();
  //do String stuff
}

BitMap b = bitmapExecute(...);
String s = stringExecute(...);

共通コードの大きなブロックがあり、タイプに基づいて小さなセクションのみが異なる場合は、その共通コードを独自の関数に移動できます。

public someObject commonWork(...)
{
  //Do common stuff
}

コンパイル時に型を決定している限り、instanceofブロックを持つ必要はありません。

于 2012-06-29T17:43:25.153 に答える
0

T Here is known as Type Parameters.

// here will define the type of T in the method go()

public interface Comparable<T> { 


        public int compareTo(T t) {

           // do something...

         }
      }

For eg:

I am having a class Song, and i want to sort the songs on the basis of its title.

public class Song implements Comparable<Song> {

  private String title;

  public void compareTo(Song s) {

       title.compareTo(s.title());

    }

  public void setTitle(String s) {

    this.title = s;

   }

  public void getTitle() {

    return this.title;
   }

  public String toString() {

    return getTitle();

   }

 }
于 2012-06-29T17:32:45.190 に答える