2012-11-22 38 views
0

我不是专业的Java程序员,所以这个问题可能很简单,但我已经在网上搜索了答案,但到目前为止没有发现任何东西。Java通用操作结果类型

比方说,我们在Java中的泛型类:

public class C1 <T, U> { 
    public /*TYPE*/ f(T t, U u) { 
    return t.g(u) 
    } 

的问题是 - 我怎么能确定这个通用例子的结果的类型? 是不是有可能写出类似typeof(t.g(u))的东西?

+1

什么是'g'在'克(U)'? –

+0

g是类T的实例t的一个方法,它接受1个U类型的参数并返回X类型的结果。 –

+0

就目前而言,由于'T'没有上限,所以甚至不能调用'tg() 。 'T'不是一个类,它是一个类型参数。 –

回答

3

因为T是无限制类型,所以不能按原样调用t.g(u)。您需要对其编译时间进行约束,以便编译器知道可用的方法。否则,您只能调用Object方法,因为编译器可以推断的唯一一个关于T的扩展是Object

例如,如果你有一个接口G<U>g方法要拨打:

public interface G<U> { 
    R g(U u); 
} 

那么你会指定T extends G<U>,它可以让你打电话g()。现在你知道g()的返回类型是:它是R

public class C1<T extends G<U>, U> { 
    public R f(T t, U u) { 
     return t.g(u) 
    } 
} 

如果你想的g()结果依赖于类型TU,那么你可以做这样的事情:

public interface G<T, U> { 
    T g(U u); 
} 

public class C1<T, U> { 
    public T f(G<T, U> g, U u) { 
     return g.g(u) 
    } 
} 
+2

小心 - 您可以将'U'视为具体类型和类型参数。 –

+0

@PaulBellora啊,是的。你是对的。固定。 –

2

您的代码不会按原样编译,因为没有什么可告诉编译器t具有成员函数g。您需要声明类型参数T作为扩展某个基类或接口,确实声明了g()方法。返回类型将是g的返回类型(可能是另一种参数类型)。

例如:

public interface Foo<X, Y> { 
    X g(Y u); 
} 

public class C1 <T extends Foo<X, U>, U, X> { 
    public X f(T t, U u) { 
     return t.g(u); 
    } 
} 

注意的是,如果返回类型X也是通用的,你需要在C1类来声明一个单独的类型参数吧。可替代地,可以声明C1与单个参数化类型均匀地处理(例如,String×StringString):

public class C1 <T extends Foo<T, T>> { 
    public T f(T t, T u) { 
     return t.g(u); 
    } 
} 

的其他变型也是可能的。

0

如果你想强制吨至有法克,你必须声明你的类是这样的:

public class C1<T extends Ginterface, U extends SecInterface> { 
} 

而且这种方法的返回类型为G函数的返回类型Ginterface