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

Java 当我不';你不能提供泛型吗?

Java 当我不';你不能提供泛型吗?,java,generics,Java,Generics,我不明白为什么这会使编译器感到困惑。我使用泛型类型T来保存与put和get方法无关的对象。我一直认为GenericClass和GenericClass在功能上是相同的,但我一定是弄错了。编译doesnetwork类时,I获取不兼容类型-必需:字符串-找到:对象。有效类实现了我所期望的功能。这是怎么回事 公共类GenericClass{ 公共作废put(类键,V值){ //放到地图上 } 公共V get(类密钥){ //从地图上获取 返回null; } 公共静态类不工作{ 公共网络{ Generi

我不明白为什么这会使编译器感到困惑。我使用泛型类型
T
来保存与
put
get
方法无关的对象。我一直认为
GenericClass
GenericClass
在功能上是相同的,但我一定是弄错了。编译
doesnetwork
类时,I获取
不兼容类型-必需:字符串-找到:对象
有效
类实现了我所期望的功能。这是怎么回事

公共类GenericClass{
公共作废put(类键,V值){
//放到地图上
}
公共V get(类密钥){
//从地图上获取
返回null;
}
公共静态类不工作{
公共网络{
GenericClass GenericClass=新的GenericClass();
String s=genericClass.get(String.class);
}
}
公共静态类作品{
公共工程(){
GenericClass GenericClass=新的GenericClass();
String s=genericClass.get(String.class);
}
}
}

关于原始类型如何工作的问题——您忽略了参数的泛型类型——是它们的所有泛型及其方法都会被删除。因此,对于原始的
泛型类
get
put
方法也会丢失它们的泛型。

这是因为当您在没有额外类型信息的情况下使用泛型类时,您使用的是有时称为类的
退化形式。
degenerate
表单已删除所有泛型类型信息

从本质上讲,您的类类似于:

public class GenericClass {
    public void put(Class key, Object value) {
        // put into map
    }

    public Object get(Class key) {
        // get from map
        return null;
    }

    ...
}
因此,您看到的编译器响应是预期的行为


它在一篇文章中提到。

genericClass
更接近
genericClass
而不是
genericClass
,也就是说,我不明白为什么
不工作
应该不工作。尝试强制类型:
genericClass.get(String.class)
(不确定它的语法是否正确)原始类型的使用本质上是,表示您正在使用旧的、预泛型代码,以实现兼容性;关于原始类型的大多数奇怪之处都是出于兼容性目的而进行的黑客攻击。但是,对于一个为什么这个特定行为是必要的例子,考虑下面的例子:用java 1.4构建的遗留代码必须从java 1.4中得到相同的行为——从java 1.4——前泛型-以及从<代码>列表>代码>从Java 5,它被重写为泛型。这很尴尬,但对于向后兼容性来说是必要的——但对于新代码来说,这绝对不是问题,因为新代码基本上不应该使用原始类型。“新代码基本上不应该使用原始类型”-我同意这一点。因此,如果我在处理对象时不知道类型,我应该使用
?例:配备清洗装饰器的车辆应使用
wash(车辆)
而不是
wash(车辆)