Tag: 擦除

方法重载时重复的方法

以下代码提供编译错误,错误“重复方法” static int test(int i){ return 1; } static String test(int i){ return “abc”; } 这是预期的,因为重载方法具有相同的签名并且仅在返回类型方面不同。 但是下面的代码编译好了警告: static int test1(List l){ return 1; } static String test1(List l){ return “abc”; } 因为,我们知道Java Generics在Erasure上运行,这意味着在字节码中,这两种方法具有完全相同的签名,并且与返回类型不同。 更令我惊讶的是,以下代码再次出现编译错误: static int test1(List l){ return 1; } static String test1(List l){ return “abc”; } 如果有重复的方法,第二个代码如何正常工作而不会给出任何编译错误?

具有相同擦除的两种方法不是必须覆盖等效的(或者它们之间的签名不是子签名)?

我正在为jdk6阅读令人难以置信的书“java scjp认证的程序员指南”,以及关于generics覆盖的部分。 在它上面描述了subsignature和override-equivalent,并描述了我引用的覆盖等价的一些例子: 给定以下三个类中的generics方法声明: static void merge (MyStack s1, MyStack s2) { /*…*/ } static void merge (MyStack s1, MyStack s2) { /*…*/ } static void merge (MyStack s1, MyStack s2) { /*…*/ } 擦除后,所有三种方法的签名是: merge(MyStack, MyStack)即方法的签名是覆盖等价的,因此这些方法不会重载。 我并不完全同意这些方法是覆盖等价的,事实上我认为这些方法有一个“擦除名称冲突”,但没有一个是另一个的子签名……可能是错误的,所以我想对此有所了解。 子签名的定义让我觉得它们不是它们之间的子签名。 在JSL 6#8.4.2方法签名中( http://docs.oracle.com/javase/specs/jls/se6/html/classes.html#8.4.2 ) 如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。 如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型: 他们。 具有相同数量的forms参数(可能为零) 它们具有相同数量的类型参数(可能为零) 设为M的forms类型参数,并让为N的forms类型参数。将N的类型中每个出现的Bi重命名为Ai的边界对应的类型变量和M和N的参数类型是相同的。 如果m2与m1具有相同的签名,或者m1的签名与m2的签名擦除相同,则方法m1的签名是方法m2的签名的子签名。 … 如果m1是m2的子签名或m2是m1的子签名,则两个方法签名m1和m2是覆盖等价的。 在JSL 8#8.4.2中。 方法签名( […]

为什么使用原始类型变量会影响签名而不引用类型参数?

在研究另一个问题时,我碰到了1.8.0_112 Sun-Oracle编译器的这种有趣的行为(我没有和其他人一起测试过): import java.util.List; interface Alpha { List intList(); } interface Beta { List intList(); } class Main { public static void main(String[] args) { Alpha rawAlpha = null; Alpha charAlpha = null; Alpha qmAlpha = null; Beta beta = null; for (Integer i : charAlpha.intList()) {} for (Integer i : qmAlpha.intList()) {} for (Integer […]

实现Comparable,compareTo名称冲突:“具有相同的擦除,但不会覆盖其他”

我想有一个compareTo方法,它接受一个Real(一个用于处理任意大而精确的实数的类[好吧,只要它的长度小于2 ^ 31])和compareTo方法一个对象,但Java不让我,我没有足够的经验知道为什么。 我只是尝试修改类来实现Comparable,我在下面收到了这些错误消息。 我真的不明白错误信息是什么意思,但我知道它与我可怕的方式有关,我试图给我的课程一些灵活性,为我制作的每一种方法提供所有不同的方法签名,我可以解决它通过删除compareTo(Object other)方法,但我最好保留它。 所以我真正要问的是:有没有办法让这些错误消息消失而不删除compareTo(Object other)方法,这些错误究竟是什么意思? 另外,我知道已经有一些像BigInteger这样的内置Java类以及我正在尝试使用这个类的东西,但我正在为了与Project Euler( https://一起使用)的乐趣/满足感而这样做projecteuler.net/ )。 Jake@Jake-PC /cygdrive/c/Users/Jake/Documents/Java/Mathematics $ javac Real.java Real.java:377: error: name clash: compareTo(Real) in Real overrides a method whose erasure is the same as another method, yet neither overrides the other public int compareTo(Real other) ^ first method: compareTo(Object) in Real second method: compareTo(T) in Comparable […]

Gson TypeToken如何运作?

据我所知,在Java中,例如,C#generics是编译时function,并通过类型擦除删除。 那么,Gson的TypeToken如何真正起作用? 它是如何获得对象的generics类型的?