Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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_Generics_Type Parameter - Fatal编程技术网

为什么';Java是否允许扩展类型参数?

为什么';Java是否允许扩展类型参数?,java,generics,type-parameter,Java,Generics,Type Parameter,为什么这段代码不编译 public class Wrapper<T> extends T {} 当您扩展一个类时,您可以通过超级类提供的一些附加功能来扩展现有的功能。当超类是T时,它可以是任何东西,但您不知道是什么。那么,你将如何扩展一些你一无所知的东西呢 Persistent如何知道如何序列化TT可以是任何内容。例如,Void或InputStream或Integer但在实现Persistent时,您无法知道这一点。这难道不能使用ObjectOutputStream和/或可序列化接

为什么这段代码不编译

public class Wrapper<T> extends T {}

当您扩展一个类时,您可以通过超级类提供的一些附加功能来扩展现有的功能。当超类是
T
时,它可以是任何东西,但您不知道是什么。那么,你将如何扩展一些你一无所知的东西呢

Persistent
如何知道如何序列化
T
T
可以是任何内容。例如,
Void
InputStream
Integer
但在实现
Persistent
时,您无法知道这一点。这难道不能使用
ObjectOutputStream
和/或
可序列化
接口来实现吗?在上面的示例中,您将如何实现
load()
?我明白您的意思。我刚试过,但我找不到办法,你说得对。这也是为什么不可能做到这一点的答案吗?难道没有办法在这个包装类中编写任何代码吗?我不知道这是否也是为什么不可能的答案。Java的设计者一定有理由不允许这样做。我给出的可能就是其中之一。在某些情况下,我们可能只对
对象的公共接口感到满意,例如,重新实现toString()方法,向T的现有toString()实现(如果有的话)添加一些内容,允许我们基本上“扩展”通过围绕类创建这种包装器,在运行时创建任何类?我不是说它有用,但为什么严格禁止它?@AdriaanJacobs如果你想要一个包装器,那么创建一个类
wrapper
并包装你想要的任何东西;把所有的东西都放在那里。对继承做这样的事情本质上是错误的。@michid的答案解释了原因。
Integer i1 = Integer.valueOf(5);
Persistent<Integer> i2= new Persistent<Integer>();
i2.load(i1) //example method to load i1 into i2, basically serializing it

List<Integer> myIntegers = new ArrayList<>();
famousPeople.add(i1);
famousPeople.add(i2);