如何在Java泛型方法中定义返回类型?

时间:2012-06-29 17:15:14

标签: java generics instanceof

我有一个通用的方法,例如:

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 个答案:

答案 0 :(得分:2)

你可能会这样做:

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

    }
}

答案 1 :(得分: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) { ... }

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

Generics最初添加到Java中以支持Collection确切知道它包含的内容。例如,这是一种保证List仅包含字符串的方法,即将其声明为List<String>。然后扩展了这个功能,但保留了基本概念 - 保证如果你将一个X类型的未知对象放入其中,即使你不知道X在编译时是什么,你也可以编写逻辑来获得相同的类型X出。 (This article是一个有趣的读物,如果过时了。)

not 意味着它应该在方法或类中应用的逻辑依赖于输入的数据类型的情况下使用。 应该重要传入数据类型,并且在未知数据类型X上一致地应用相同的逻辑。所以,如果你有不同的逻辑对于String而不是双打,你不应该使用泛型。

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

答案 2 :(得分: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();

   }

 }

答案 3 :(得分:0)

如果您已经按照这种方式分割功能,并且输入相同,那么您可能会使用不同的功能。因此,而不是(使用Jeshurun的回答)

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块。