2012-06-29 138 views
0

我有一个通用的方法,例如:如何在Java泛型方法中定义返回类型?

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(); 
+10

如果你需要这样做,这听起来像你不想要泛型。 –

+0

http://stackoverflow.com/questions/5734720/java-generics-obj-instanceof-t?rq=1 看看这个 –

+3

也许你正在寻找重载一个函数,而不是泛型?有一个方法'执行(String s)'和另一个'执行(BitMap b)'? – Thomas

回答

2

你也许可以做这样的事情:

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

    } 
} 
0

牛逼这里素有类型参数。

//此处将方法去()

public interface Comparable<T> { 


     public int compareTo(T t) { 

      // do something... 

     } 
     } 

对于例如定义T的类型:

我有一个类歌曲,我想在歌曲排序其标题的基础。

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(); 

    } 

} 
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,支持收集准确知道它包含。例如,这是一种保证列表仅保留字符串的方式,例如声明它为List<String>。然后扩展了这个能力,但是保留了基本概念 - 保证如果你放入一个未知的X类型对象,即使你不知道在编译时X是什么,你也可以编写逻辑来得到相同类型的X出。 (This article是一个有趣的阅读,如果过时。)

这并不意味着它应该使用其中一个方法或类应用的逻辑是依赖于输入的数据类型。它应该被使用的地方不是的问题传入的数据类型,并且相同的逻辑将一致地应用于未知的数据类型X.所以如果你有不同的字符串逻辑比双倍,你不应该使用仿制药。

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

+0

的选择我明白,但如果我需要: 'code'public static String execute(String s){... } public static Integer execute(String s){...} public static Double execute(String s){...} public static Object execute(String s){...}'code' All depends在字符串是什么。如果字符串是图片网址,我想获取位图或可绘制。如果字符串是XML或JSON的URL,我想得到它。 – bvitaliyg

+0

什么是强迫你使用泛型?这是功课吗? –

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

相关问题