Java泛型操作结果类型
我不是专业的Java程序员,所以这个问题可能很简单,但我在网上搜索了答案,但到目前为止没有找到任何答案 假设我们在Java中有一个泛型类:Java泛型操作结果类型,java,templates,generics,types,Java,Templates,Generics,Types,我不是专业的Java程序员,所以这个问题可能很简单,但我在网上搜索了答案,但到目前为止没有找到任何答案 假设我们在Java中有一个泛型类: public class C1 <T, U> { public /*TYPE*/ f(T t, U u) { return t.g(u) } 公共类C1{ 公共/*类型*/f(T,U){ 返回t.g(u) } 问题是-如何确定这个通用示例的结果类型? 有没有可能写出类似于typeof(t.g(u))的东西?您的代码不会按原
public class C1 <T, U> {
public /*TYPE*/ f(T t, U u) {
return t.g(u)
}
公共类C1{
公共/*类型*/f(T,U){
返回t.g(u)
}
问题是-如何确定这个通用示例的结果类型?
有没有可能写出类似于
typeof(t.g(u))的东西
?您的代码不会按原样编译,因为没有任何东西可以告诉编译器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);
}
}
其他变体也是可能的。您的代码不会按原样编译,因为没有任何东西可以告诉编译器
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);
}
}
其他变体也是可能的。如果您想强制t拥有方法g,您必须像下面这样声明您的类:
public class C1<T extends Ginterface, U extends SecInterface> {
}
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)
}
}
公共类C1{
}
此方法的返回类型将是Ginterface中g函数的返回类型如果您想强制t拥有方法g,您必须像这样声明您的类:
public class C1<T extends Ginterface, U extends SecInterface> {
}
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)
}
}
公共类C1{
}
此方法的返回类型将是Ginterface中g函数的返回类型您不能调用t.g(u)
这是因为T
是一种无界类型。您需要在其上设置编译时间限制,以便编译器知道可用的方法。否则,您只能调用Object
方法,因为编译器只能推断T
是扩展Object
例如,如果您有一个带有要调用的G
方法的接口G
:
public interface G<U> {
R g(U u);
}
如果希望g()
的结果依赖于类型T
和U
,则可以执行以下操作:
public class C1<T extends Ginterface, U extends SecInterface> {
}
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)
}
}
公共接口G{
tg(U);
}
公共类别C1{
公共TF(G,U){
返回g.g(u)
}
}
您不能调用t.g(u)
这是因为T
是一种无界类型。您需要在其上设置编译时间限制,以便编译器知道可用的方法。否则,您只能调用Object
方法,因为编译器只能推断T
是扩展Object
例如,如果您有一个带有要调用的G
方法的接口G
:
public interface G<U> {
R g(U u);
}
如果希望g()
的结果依赖于类型T
和U
,则可以执行以下操作:
public class C1<T extends Ginterface, U extends SecInterface> {
}
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)
}
}
公共接口G{
tg(U);
}
公共类别C1{
公共TF(G,U){
返回g.g(u)
}
}
g是类t的实例t的一个方法,它接受1个类型为U的参数并返回类型为X的结果。目前,您甚至不能调用t.g()
因为T
没有上限。T
不是一个类,它是一个类型参数。@danilo2是X的一个特定类型,或者它本身是泛型的?它与T有什么关系?而U是类T的实例T的一个方法,它接受类型U的一个参数并返回类型X的结果。就目前而言,你甚至不能调用T.g()
因为T
没有上限。T
不是一个类,它是一个类型参数。@danilo2是一个特定类型,或者它本身是泛型的?它到底与T和U有什么关系?小心-你或者把U
当作一个具体类型和类型参数。小心-你或者把U
当作具体类型和类型参数。