2011-06-15 140 views
-3

對於這個問題,我們假設可以在java中擴展類String。在下面的代碼:Java - 通用類型

T getId () ; 
void setId (T t) ; 
} 
public class Person implements Identifiable <String> { . . . } 
public class Car implements Identifiable <Integer> { . . . } 
public class UTFString extends String { . . . } 
public class Tourist implements Identifiable <UTFString> { . . . } 

Identifiable <Y> z ; 
if (. . .) { 
    z = new Person () ; 
} else { 
    z = new Tourist () ; 
} 
z.setId(new UTFString(…)) 

有人問我什麼是正確的類型Y的我知道的Y類型,應該是:? super UTF-STRING,意思是:Identifiable <? super UTF-STRING> z;但爲什麼?正如我所看到的,Persron和Tourist實現了接口UTFSTRING,爲此它應該是? extends UTF-STRING。我想念什麼?

+0

請問您是否可以更改您的問題,我無法理解一個單詞! – doNotCheckMyBlog 2011-06-15 09:37:08

+0

@krio:我編輯問題。 – Tom 2011-06-15 09:39:59

+1

爲什麼你不提供一個我們不必假設不可能的例子?會使複製和播放更容易。 (這個問題使我無法花時間處理這個問題。) – musiKk 2011-06-15 09:44:26

回答

0

PersonTourist實施Identifiable<String>Identifiable<UTFString> - 相同的通用接口,但不同類型的參數。類型參數是StringUTFString。這兩個類別都是String的子類和UTFString的超類,所以? extends String? super UTFString將被允許。它們之間的區別在於你可以用z做什麼:使用? extends String,你不能調用將泛型類型作爲參數的方法;與? super UTFString,你可能不會調用返回泛型類型的方法。由於您致電z.setId(),似乎將通用類型作爲參數,因此排除? extends String

0

如果zIdentifyable<UTFString>,然後z = new Person();不應該編譯,因爲Person沒有延伸Identifyable<UTFString>

我應該注意到UTFString的概念似乎相當混亂 - 字符串在Java中沒有編碼。 (他們總是用Unicode,可以有一個編碼的唯一事情是字節序列。)

+0

也許這是一個UTF8Encoded字符串? (Java的字符串 - 這是最終的,所以它不能是上面的字符串 - 例如對於英語來說是相當浪費的記憶方式。此外,Java的字符串是真正的UTF-16編碼(因爲它*利用*代理對),除了它可以包含無效序列;-) – 2011-06-15 09:49:04

+0

@pst可以,是的。我想從我認爲最差的問題的質量來看。 – Henning 2011-06-15 09:57:14

0

我想你問你爲什麼要用?超級UTF-STRING而不是?擴展UTF-STRING。 如果這是一個問題,您可以在聲明z時使用Identifiable。 人和遊客執行它,所以你可以使用它。 老實說,我認爲遊客應該擴展一個人,因爲所有的遊客都是人(在詞彙含義上),所以我要聲明

public class Person implements Identifiable {。 。 。 }

public class Tourist extends Person {。 。 。 }

Person z = null; (......){ z = new Person(); } else { z = new Tourist(); } z.setId(new UTFString(...))