作者sbrhsieh (偶尔想摆烂一下)
看板java
标题Re: [问题] 有关generics泛型的函式参数super用法
时间Fri Mar 4 20:27:07 2011
※ 引述《pankk (KK)》之铭言:
: 小弟最近在学java观念上遇到了些难题,
: 想请教各位一个问题:
: 在泛型函式中为了要使class Write里的setName(T)可以不为read-only,
: class test里的WriteName函式把它参数形式改为(Write<? super String>),
: 使得在写入name时可以编译通过,
: 但是我想不懂的是我又加了一行setName(new Object())它就编不过,
: 我在想我逻辑是不是又乱了,好不容易稍微看懂为啥要用super取代extends了,
: 没想到又卡住了...Orz,我是不是观念认知出了些差错?
: //=========================================
: class Write<T> {
: private T name;
: public Write(T value) {
: name = value;
: }
: public void setName(T a_name) {
: name = a_name;
: }
: public T getName() {
: return name;
: }
: }
: public class test {
: public static void main(String[] args) {
: test t= new test();
: t.WriteName(new Write("Ha"));
: t.WriteName(new Write(new Object()));
: }
: public void WriteName(Write<? super String> value) {
: //value.setName(new Object()); //compile error
: value.setName("Test2");
: System.out.println(value.getName());
: }
: }
: //=========================================
对一个 Write<? super String> object 进行 setName 操作,所给定的参数值
至少得是 String(得是 String or String derived type),类比於
Write<? extends String> object 进行 getName 操作所产出的值至少会是
String。
Write<? super String> reference 可以用来操作
Write<
String>,
Write<
java.io.Serializable>,
Write<
CharSequence>,
Write<
Comparable<String>>,
Write<
Object>
这些类的物件,不管是哪一种,当你提供 String object 来进行 setName 操作
都是可以的,因为 String 相容於上面任一种
type argument。
如果想要更深入的去了解这方面的东西,可以 "covariance" "contravariance"
为关键字去找相关的资料。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.168.158
※ 编辑: sbrhsieh 来自: 220.136.168.158 (03/04 20:29)
1F:推 pankk:谢谢你,我想我该去更深入了解你说的key word 03/06 13:09