我不是专业的Java程序员,所以这个问题可能很简单,但我已经在网上搜索了答案,但到目前为止没有发现任何东西。Java通用操作结果类型
比方说,我们在Java中的泛型类:
public class C1 <T, U> {
public /*TYPE*/ f(T t, U u) {
return t.g(u)
}
的问题是 - 我怎么能确定这个通用例子的结果的类型? 是不是有可能写出类似typeof(t.g(u))
的东西?
我不是专业的Java程序员,所以这个问题可能很简单,但我已经在网上搜索了答案,但到目前为止没有发现任何东西。Java通用操作结果类型
比方说,我们在Java中的泛型类:
public class C1 <T, U> {
public /*TYPE*/ f(T t, U u) {
return t.g(u)
}
的问题是 - 我怎么能确定这个通用例子的结果的类型? 是不是有可能写出类似typeof(t.g(u))
的东西?
因为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()
结果依赖于类型T
和U
,那么你可以做这样的事情:
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)
}
}
小心 - 您可以将'U'视为具体类型和类型参数。 –
@PaulBellora啊,是的。你是对的。固定。 –
您的代码不会按原样编译,因为没有什么可告诉编译器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
×String
→String
):
public class C1 <T extends Foo<T, T>> {
public T f(T t, T u) {
return t.g(u);
}
}
的其他变型也是可能的。
如果你想强制吨至有法克,你必须声明你的类是这样的:
public class C1<T extends Ginterface, U extends SecInterface> {
}
而且这种方法的返回类型为G函数的返回类型Ginterface
什么是'g'在'克(U)'? –
g是类T的实例t的一个方法,它接受1个U类型的参数并返回X类型的结果。 –
就目前而言,由于'T'没有上限,所以甚至不能调用'tg() 。 'T'不是一个类,它是一个类型参数。 –