Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型操作结果类型_Java_Templates_Generics_Types - Fatal编程技术网

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))的东西?您的代码不会按原

我不是专业的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))的东西

您的代码不会按原样编译,因为没有任何东西可以告诉编译器
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
当作具体类型和类型参数。