请教一个问题,网上搜了下没找到答案

watertimber
跨国公司二号人物 2016-11-22 字数 389

泛型类和泛型方法的问题

泛型方法里面会在返回值前面加上<T>(尖括号和类型变量)。

而泛型类的方法定义中返回值前面并不会有<T>。不过这些方法应该也是泛型方法吧?不知道我理解的对不对?直接的说,如果一个方法里面使用了类型变量,是不是可以肯定的说这个方法必然就是泛型方法?对于在泛型类中的泛型方法,就不需要<T>,这么理解对吗?

此外,如果一个泛型类中的方法完全不使用类型变量,这个方法应该不是泛型方法吧?

Java Java技术
10 个回复
zms
小美 2016-11-22

你说的 泛型方法 和 泛型类 是两种 “独立”的 用法(注意这里独立的含义)

比方说:

public class AClass<T> {

public T get() {

return null;

}

public <U> U getU() {

return  null;

}

}

里面的泛型方法的类型变量可以和外面不一样,如上面的 getU 方法

泛型类的 类型变量是为了“统领”,看下面的例子:

public class BClass {

public <U> U get1() {

return null;

}

public <U> U get2() {

return null;

}

public static void main(String[] args) throws Exception {

BClass one=new BClass();

String str=one.get1();

Date date=one.get2();

}

}

这里的 get1 和 get2  都有 类型变量 U,但此U和彼U完全没有关系(看main方法的调用),因为没人“统领”

~~~~~~~~~~~~~~~~~~~不是这个意思

:不知道我理解的对不对?直接的说,如果一个方法里面使用了类型变量,是不是可以肯定

:的说这个方法必然就是泛型方法?对于在泛型类中的泛型方法,就不需要<T>,这么理解对吗?

【 在 watertimber (test) 的大作中提到: 】

: 标  题: 请教一个问题,网上搜了下没找到答案

: 发信站: 水木社区 (Tue Nov 22 20:37:19 2016), 站内

: 泛型类和泛型方法的问题

: 泛型方法里面会在返回值前面加上<T>(尖括号和类型变量)。

: 而泛型类的方法定义中返回值前面并不会有<T>。不过这些方法应该也是泛型方法吧?

: 此外,如果一个泛型类中的方法完全不使用类型变量,这个方法应该不是泛型方法吧?

: --

watertimber
跨国公司二号人物 2016-11-22

首先谢谢解答。

没有完全看明白。说一下我的理解,不对的请指正

你说的“统领”这个词,我的理解是说类中的方法以及域,局部变量等可以使用这个类型变量,相当于是一个公用的

所以当将类型变量换成具体的类以后,相关的使用也会具体

而对于泛型方法,它是可以独立于泛型类存在的(这一点我了解,泛型类完全可以定义在普通类中),所以它的类型变量和泛型类本身的无关,不被“统领”

不过,我想知道的的是,比如AClass类中的get方法是不是泛型方法呢?

【 在 zms 的大作中提到: 】

: 你说的 泛型方法 和 泛型类 是两种 “独立”的 用法(注意这里独立的含义)

: 比方说:

: public class AClass<T> {

: ...................

zms
小美 2016-11-22

理解的很好

是的。其实类型变量名字就不一样。

带类型变量的 方法 就叫泛型方法

【 在 watertimber (test) 的大作中提到: 】

: 标  题: Re: 请教一个问题,网上搜了下没找到答案

: 发信站: 水木社区 (Tue Nov 22 21:18:00 2016), 站内

: 首先谢谢解答。

: 没有完全看明白。说一下我的理解,不对的请指正

: 你说的“统领”这个词,我的理解是说类中的方法以及域,局部变量等可以使用这个类型变量,相当于是一个公用的

: 所以当将类型变量换成具体的类以后,相关的使用也会具体

: 而对于泛型方法,它是可以独立于泛型类存在的(这一点我了解,泛型类完全可以定义在普通类中),所以它的类型变量和泛型类本身的无关,不被“统领”

: 不过,我想知道的的是,比如AClass类中的get方法是不是泛型方法呢?

: 【 在 zms 的大作中提到: 】

: : 你说的 泛型方法 和 泛型类 是两种 “独立”的 用法(注意这里独立的含义)

: : 比方说:

: : public class AClass<T> {

: : ...................

: --

watertimber
跨国公司二号人物 2016-11-22

我斗胆引申一下吧

泛型类的定义中,类名后面有<T>,所以其中的方法定义中使用到T时,就可以认定这是一个泛型方法,无论返回值是什么类型。如果考虑返回值类型为T的方法,显然,这里的T使用的是类名后面的那个T(也是在整个类中都可以使用的类型变量)。

对于独立的泛型方法来说,必须在方法的返回类型前面加上<U>。否则,就不能表明这是个泛型方法,因为U是类型变量(而不是某个具体的类型)这个信息在别处并没有给出。<U> U get()这个泛型方法,在泛型类中的表现就是:将<U>放在类名后面来表明这是个类型变量。某种意义上来说这两种格式是统一的。如果只是某个方法是泛型方法,只需要给这一个方法提供泛型变量就可以(这个泛型方法在普通类中)。如果整个类是泛型类,就将这个类型变量<U>提取到类名后面。

所以就是

public class AClass<T> {

public T get() {

……

}

}

public class AClass {

public <T> T get() {

……

}

}

的区别。

最后的问题来了,泛型类中不使用类型变量的方法是不是泛型方法呢?应该不是吧?

public class AClass<T> {

public String getDescription() {

return "This is a generic class!";

}

}

zms
小美 2016-11-23

对!

【 在 watertimber (test) 的大作中提到: 】

: 我斗胆引申一下吧

: 泛型类的定义中,类名后面有<T>,所以其中的方法定义中使用到T时,就可以认定这是一个泛型方法,无论返回值是什么类型。如果考虑返回值类型为T的方法,显然,这里的T使用的是类名后面的那个T(也是在整个类中都可以使用的类型变量)。

: 对于独立的泛型方法来说,必须在方法的返回类型前面加上<U>。否则,就不能表明这是个泛型方法,因为U是类型变量(而不是某个具体的类型)这个信息在别处并没有给出。<U> U get()这个泛型方法,在泛型类中的表现就是:将<U>放在类名后面来表明这是个类型变量。某种意义上

: ...................

zms
小美 2016-11-23

我觉得没必要纠结于要搞清楚它是不是泛型方法,要搞清楚的是原理。

我们认为这个 getDescription 不是泛型方法,因为 签名里没有泛型变量。

但是  这个代码里方法体里可以用 泛型变量:

public String getDescription() {

T t=getBla();

return "This is a generic class!" + t;

}

【 在 watertimber (test) 的大作中提到: 】

: 标  题: Re: 请教一个问题,网上搜了下没找到答案

: 发信站: 水木社区 (Tue Nov 22 21:59:18 2016), 站内

: 最后的问题来了,泛型类中不使用类型变量的方法是不是泛型方法呢?应该不是吧?

: public class AClass<T> {

:      public String getDescription() {

:           return "This is a generic class!";

:      }

: }

: --

watertimber
跨国公司二号人物 2016-11-23

了解,谢谢

【 在 zms 的大作中提到: 】

: 我觉得没必要纠结于要搞清楚它是不是泛型方法,要搞清楚的是原理。

: 我们认为这个 getDescription 不是泛型方法,因为 签名里没有泛型变量。

: 但是  这个代码里方法体里可以用 泛型变量:

: ...................

nikezhang
难得糊涂 2016-11-24

范型类可以定义普通方法,普通类也可以定义范型方法

【 在 watertimber (test) 的大作中提到: 】

:  泛型类和泛型方法的问题

:  泛型方法里面会在返回值前面加上<T>(尖括号和类型变量)。

nikezhang
难得糊涂 2016-11-24

如果说带类型变量就是范型方法,那么class<T>  A里的方法f(T t)和<U> g(U u)都是范型方法吗?

【 在 zms (小美) 的大作中提到: 】

:  理解的很好

:  【 在 watertimber (test) 的大作中提到: 】

:  : 标  题: Re: 请教一个问题,网上搜了下没找到答案

libgcc
承接各种水军业务 2016-11-24

范型方法是不是就相当于c++里的类的模板函数?

【 在 nikezhang (难得糊涂) 的大作中提到: 】

: 标  题: Re: 请教一个问题,网上搜了下没找到答案

: 发信站: 水木社区 (Thu Nov 24 12:31:08 2016), 站内

: 范型类可以定义普通方法,普通类也可以定义范型方法

: 【 在 watertimber (test) 的大作中提到: 】

: :

: :  泛型类和泛型方法的问题

: :

: :  泛型方法里面会在返回值前面加上<T>(尖括号和类型变量)。

: --

: --