当前位置: 首页 > 面试题库 >

类型参数的阴影

齐驰
2023-03-14
问题内容

关于解决问题时遇到的类型参数,我有一个非常基本的问题。

我有一个带有字符串数组的类,正在使用自定义Comparator类进行排序。以下是我的比较器课程

class SortComparator implements Comparator<String>
    {

        @Override
        public int compare(String o1, String o2) {
            // TODO Auto-generated method stub
            return  o1.compareTo(o2);
        }

    }

上面的类运行良好,并输出期望的结果。

如果将类名从更改为SortComparatorSortComparator<String>则需要更改compare方法。更改后的类如下所示

class SortComparator<String> implements Comparator<String>
{

    @Override
    public int compare(String o1, String o2) {
        // TODO Auto-generated method stub
        return  ((java.lang.String) o1).compareTo((java.lang.String) o2);
    }

}

上面的类也可以正常运行并输出所需的结果

为什么有需要显式转换String对象o1,并o2java.lang.String时候他们已经是同一类的对象?

这个问题的答案说是因为shadowing

我知道局部变量,实例变量和类变量有阴影,但是在这种情况下它如何工作?


问题答案:

问题在于称为的通用类型String。这是泛型类型参数与实际类之间的冲突String

因为类型参数String无界的
,Java编译器会将其替换Object,因此方法的参数compare作品Object对象类没有compareTo方法,因此,你必须投。

尝试下面的示例,效果很好。

class SortComparator<T> implements Comparator<String>
{

    @Override
    public int compare(String o1, String o2) {
        // TODO Auto-generated method stub
        return  o1.compareTo(o2);
    }

}

请查看有关泛型类型清除的
Java文档

在类型擦除过程中,Java编译器将擦除所有类型参数,如果类型参数是有界的,则将每个参数替换为其第一个边界;如果类型参数是无界的,则将其替换为对象。

下面的Example直接从上面的Java文档复制而来,以更加清楚。

考虑以下表示单个链接列表中的节点的通用类:

public class Node<T> {

    private T data;
    private Node<T> next;

    public Node(T data, Node<T> next) }
        this.data = data;
        this.next = next;
    }

    public T getData() { return data; }
    // ...
}

由于类型参数T是无界的,因此Java编译器将其替换为Object:

public class Node {

    private Object data;
    private Node next;

    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }

    public Object getData() { return data; }
    // ...
}


 类似资料:
  • 一、泛型 Scala 支持类型参数化,使得我们能够编写泛型程序。 1.1 泛型类 Java 中使用 <> 符号来包含定义的类型参数,Scala 则使用 []。 class Pair[T, S](val first: T, val second: S) { override def toString: String = first + ":" + second } object ScalaAp

  • 参数 概念 -Xint 解释执行,运行时将 class 翻译成机器码。 -Xcomp 编译执行,第一次使用时,以方法为单位,将热点代码翻译成机器码,保存在 JVM 中。 -Xmixed 混合 -XX 参数 Boolean 类型 -XX:[+-]\ 非 Boolean 类型 -XX:\=\

  • 很好的一天。我不熟悉使用VSCode键入脚本。 获取以下错误: > 错误TS2322:类型'()= 代码: DTO。输电系统 LinkedObject.ts 我正在尝试使用上述接口方法实例化类: TravelClientFormPopulator.ts 任何帮助都将不胜感激。

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 问题总结:我想传递一个带有类型参数(如

  • 在我新创建的Angular应用程序中,我尝试使用mattlewis92的Angular日历来创建他的日历。我已经复制了他的github:https://mattlewis92.github.io/Angulat-calendar/#/kitchenter-sink上列出的所有步骤和代码,但我在第一行总是发现一个错误,即指出“{static:boolean;}类型的参数不能分配给{read?:any