2011-06-15 86 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(...))