泛型用了很久,只知道一些常识...很多的细节没有搞清楚...
今天使用Eclipse写泛型的时候碰到了情况
与http://www.iteye.com/problems/7602相似
public interface I<X> {
public void query(Map <String, Object> map, int count);
}
public class C implements I {
public void query(Map <String, Object> map, int count) {}
}
这样子写,编译不通过...
提示错误:
****has the erasure as****
引用
关键是两者的编译器实现不同。上面的程序可以直接在命令行用javac编译通过,所以我估计jdeveloper使用的编译器就是javac。我以前也一直认为eclipse也是直接使用javac编译器,刚才查看了eclipse插件目录下org.eclipse.jdt.core.jar,里面包括词法分析器,语法解析器,编译器,我才确定eclipse使用了自己的编译器。至于netbeans没有研究,应该也是使用了自己的编译器。
p.s. 在Eclipse下如果接口I中不带任何方法或者方法签名中不使用泛型,则不会出错误。
to feng_gladys:从eclipse提示的错误:
Name clash: The method query(Map<String,Object>, int) of type C has the same erasure as query(Map, int) of type I but does not override it
这样解释也合乎情理,但是从语言规范上来说应该是容许这种情况发生的,不应该有任何错误,至多也只是警告,不过提示错误也未尝不是坏事。
以下这段话是 The Java Programming Language 中描述overridding的:
A method in a subtype potentially overrides an accessible method in a super type if the two methods have the same name and have override-equivalent signatures. We say "potentially overrides" because there is an additional requirement to be met: The signature of the subclass method must be the same as that of the superclass method, or it must be the same as the erasure of the signature of the superclass method. This constraint makes overriding a "one-way street":
A method without generic types can override a method with generic types, but not the other way around.
上面就改成
public interface I<X> {
public void query(Map <String, Object> map, int count);
}
public class C implements I {
public void query(Map map, int count) {}
}
----------------------------------------
但是当这样写的时候:
public interface I<X> {
public void query(Map <String, Object> map, int count);
}
public class C implements I <X>{
public void query(Map <String, Object> map, int count) {}
}
子类中的方法与父类的方法就必须一样,否则也出错...
更多的细节还有待学习...
分享到:
相关推荐
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了类型安全性和代码可读性。泛型允许我们在编写类、接口和方法时指定一种或多种类型,使得编译器能够检查代码中对象的类型...
C#泛型是一种强大的编程工具,它为C#程序员提供了更大的灵活性和性能优化。泛型在.NET Framework 2.0中被引入,旨在解决传统集合类(如ArrayList)在处理不同类型数据时存在的性能和类型安全问题。以下是关于C#泛型...
在C#中,泛型主要体现在以下几个方面:泛型类、泛型接口、泛型方法、泛型委托以及泛型集合。 1. **泛型类**:泛型类是在声明类时定义一个或多个类型参数。例如,`List<T>` 就是一个典型的泛型类,其中 `T` 是类型...
C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。泛型提高了代码的效率、安全性和灵活性,避免了不必要的类型转换,并提供了更强的类型检查。在C#中,泛型...
- **原始类型与泛型**:原始类型(如int、double)不能直接用作类型参数,但可以使用装箱类型(Integer、Double)。 总之,Java泛型是现代Java开发中不可或缺的一部分,它提高了代码的质量和效率。通过理解和熟练...
Java泛型是自Java 1.5版本引入的一项重要特性,极大地提高了代码的类型安全性和重用性。本文将深入探讨Java泛型的概念、优点、使用方式及其在实际开发中的应用。 **一、泛型的基本概念** 泛型是Java语言中的一种...
**3.1 理解泛型** 理解 C# 中的泛型需要掌握以下几个概念: - **泛型类型:**如 `List<T>` 中的 `T`,代表类型参数。 - **泛型方法:**允许方法接受类型参数,如 `void Add(T item)`。 - **泛型约束:**可以限制...
- **实例化泛型**:创建带有具体类型的对象,如`List<String> stringList = new ArrayList();`。 4. **泛型的边界** 在Java中,可以指定泛型类型的边界,例如`List<? extends Number> numberList`表示numberList...
11. **异常中使用泛型**:可以创建泛型异常,如`throw new MyException(value)`,但需要确保异常处理时能够正确捕获。 12. **获取泛型的参数类型**:在运行时无法直接获取泛型参数类型,但可以通过反射API间接获取...
Java的泛型采用**类型拭去(Type Erasure)**,这意味着在编译后,所有的泛型信息都会被擦除,生成的字节码并不包含泛型。因此,泛型的效率不会受到负面影响,但运行时无法获取泛型信息。 在使用泛型时,我们还会...
C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。在C#(Visual Studio 2008及更高版本)中,泛型提供了类型安全性和性能优势,因为它们避免了在运行时进行...
什么是Java泛型** Java泛型是一种允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的特性。它可以帮助开发者在类、接口和方法中使用类型参数,从而提高代码的复用性和类型安全性。 **2. 泛型类和泛型...
9. **多级泛型**: 我们还可以创建嵌套的泛型类型,例如`Dictionary, TValue>`,其中`TKey`和`TValue`都是泛型类型参数。 10. **泛型与接口、抽象类的结合**: 泛型类型可以实现接口或继承抽象类。例如,`...
在C#编程语言中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全和性能。"C#深刻解读泛型"的主题深入探讨了这一核心特性,帮助开发者更好地理解和利用泛型的优势。以下是关于C#泛型的一些关键...
本文将深入探讨C#中的泛型,它是C#的一个重要特性,对于初学者来说,理解并掌握泛型是提高编程效率和代码复用性的关键。 泛型在C#中引入的主要目的是为了提高类型安全性和性能。它允许我们在编写代码时定义不特定于...
2. **理解泛型** - 泛型的核心是类型参数,它是一个占位符,代表一个未知的类型。例如,`List<T>`中的`T`就是一个类型参数,当我们实例化`List<int>`时,`T`被替换为`int`类型。 - 泛型方法和泛型类的区别在于,...
10. **多态和泛型**:泛型与多态相结合,可以编写出更加灵活且类型安全的代码。例如,可以定义一个接受任何集合类型的方法,只要它们的元素类型遵循特定的约束。 11. **实例化泛型类**:泛型类的实例化有两种方式,...
在C#中,泛型是一种强大的工具,它允许开发者创建可以适用于多种数据类型的类、接口和方法。这极大地提高了代码的重用性、效率和安全性。在"高级无敌,c#泛型例子"这个主题中,我们将深入探讨C#泛型的基本概念、优势...