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) { ... }

前三个方法将为您支持的三种离散数据类型定义逻辑,而最后一个方法将为您支持的任何其他数据类型定义逻辑和/或错误处理。(当然,这不包括非 int 或 double 类型的原语,但这只是一个示例。)

泛型最初被添加到 Java 以支持 Collection 确切地知道它包含什么。例如,这是一种通过将 List 声明为 a 来保证 List 仅包含 Strings 的方法List<String>。然后扩展了此功能,但保留了基本概念 - 保证如果您放入 X 类型的未知对象,即使您在编译时不知道 X 是什么,您也可以编写逻辑以获得相同的 X 类型出去。(这篇文章很有趣,如果过时了。)

这并不意味着它应该在方法或类中应用的逻辑取决于输入的数据类型时使用。它应该用在与传入数据类型无关的地方,并且将在未知数据类型 X 上一致地应用相同的逻辑。因此,如果 String 的逻辑与 Doubles 的逻辑不同,则不应使用泛型。

tl; dr: 由于原始帖子根据输入参数的数据类型指示了不同的逻辑,因此不适合使用泛型。execute应该改用基于支持的数据类型重载方法。

于 2012-06-29T17:36:24.970 回答
0

T 这里称为类型参数。

// 这里会在方法go()中定义T的类型

public interface Comparable<T> { 


        public int compareTo(T t) {

           // do something...

         }
      }

例如:

我正在上课,我想根据歌曲的标题对歌曲进行排序。

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 回答
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 回答