Java 定义没有特定类型的集合

Java 定义没有特定类型的集合,java,collections,Java,Collections,(i) -定义集合而不指定类型意味着什么?用于什么目的 它是为你做的吗 (ii)-我可以通过任何方式向集合添加不同的类型吗 这里有一个例子-没有编译错误,尽管它警告我 但是,除此之外,还有一个运行时错误 在不指定类型参数的情况下定义集合(或任何类型化类)将使用原始类型调用。它的存在仅是为了向后兼容,不应在新代码中使用。If有效地移除泛型对类型的所有影响 通常,您可以将集合定义为接受对象:然后它将接受所有值:set vals=new HashSet()。但是,这对TreeSet不起作用,因为它需要

(i) -定义集合而不指定类型意味着什么?用于什么目的 它是为你做的吗

(ii)-我可以通过任何方式向集合添加不同的类型吗

这里有一个例子-没有编译错误,尽管它警告我

但是,除此之外,还有一个运行时错误

  • 在不指定类型参数的情况下定义集合(或任何类型化类)将使用原始类型调用。它的存在仅是为了向后兼容,不应在新代码中使用。If有效地移除泛型对类型的所有影响
  • 通常,您可以将集合定义为接受
    对象
    :然后它将接受所有值:
    set vals=new HashSet()
    。但是,这对
    TreeSet
    不起作用,因为它需要其值相互关联。如果您想将任意类型添加到相同的
    树集
    (这通常是某些架构问题的迹象,即设计气味),那么您需要实现自己的,可以比较任意元素并将其传递到
  • 在不指定类型参数的情况下定义集合(或任何类型化类)将使用原始类型调用。它的存在仅是为了向后兼容,不应在新代码中使用。If有效地移除泛型对类型的所有影响
  • 通常,您可以将集合定义为接受
    对象
    :然后它将接受所有值:
    set vals=new HashSet()
    。但是,这对
    TreeSet
    不起作用,因为它需要其值相互关联。如果您想将任意类型添加到相同的
    树集
    (这通常是某些架构问题的迹象,即设计气味),那么您需要实现自己的,可以比较任意元素并将其传递到
  • i) 这意味着它可以有任何对象。如果要添加任何类型。(通常是设计问题)

    ii)可以使用类型擦除

    但是,除此之外,还有一个运行时错误

    在编译时获取错误通常比获取运行时错误要好。(更容易找到和修复)

    i)这意味着它可以有任何对象。如果要添加任何类型。(通常是设计问题)

    ii)可以使用类型擦除

    但是,除此之外,还有一个运行时错误


    在编译时获取错误通常比获取运行时错误要好。(更容易找到和修复)

    直到Java 1.4,都没有泛型。所有集合只能包含
    对象
    ,并且在将对象从集合中取出后使用该对象时,必须对其进行分类强制转换。你会这么做吗

        public static void main(String[] args) {
           Set vals = new TreeSet();
           vals.add("one");
           vals.add(1);
           vals.add("two");
           System.out.println(vals);
    }
    
    而不是

    Set vals = new Treeset();
    String s = (String)vals.get(0);
    
    Set vals=new Treeset();
    字符串s=vals.get(0);
    

    放置没有共享接口或超类的不同类型的对象是非常糟糕的做法,因为当您将对象从集合中取出时,您不知道如何处理该对象。

    直到Java 1.4,没有泛型。所有集合只能包含
    对象
    ,并且在将对象从集合中取出后使用该对象时,必须对其进行分类强制转换。你会这么做吗

        public static void main(String[] args) {
           Set vals = new TreeSet();
           vals.add("one");
           vals.add(1);
           vals.add("two");
           System.out.println(vals);
    }
    
    Set<String> vals = new Treeset<String>();
    String s = vals.get(0);
    
    而不是

    Set vals = new Treeset();
    String s = (String)vals.get(0);
    
    Set vals=new Treeset();
    字符串s=vals.get(0);
    
    放置没有共享接口或超类的不同类型的对象是非常糟糕的做法,因为从集合中取出对象时,您不知道如何处理它。

    private Set s1;
    
    Set<String> vals = new Treeset<String>();
    String s = vals.get(0);
    
    公开募捐{ 阿莫德(s1); } /*第7行*/公共空心板(成套面板){ }
    如果您通过将第7行更改为

    private Set<JPanel> s1;
    
    public void run() {
        aMethod(s1);
    }
    
    /* line 7 */ public void aMethod(Set panels) {
    
    }
    
    public void-aMethod(设置面板){
    
    它将不再编译。如果您将该行重构为

    public void aMethod(Set<Object> panels) {
    
    public void-aMethod(设置面板){
    
    它仍将像以前一样编译,并且作为额外的奖励,您将不再拥有“Set is raw…”警告

    private Set s1;
    公开募捐{
    阿莫德(s1);
    }
    /*第7行*/公共空心板(成套面板){
    }
    
    如果您通过将第7行更改为

    private Set<JPanel> s1;
    
    public void run() {
        aMethod(s1);
    }
    
    /* line 7 */ public void aMethod(Set panels) {
    
    }
    
    public void-aMethod(设置面板){
    
    它将不再编译。如果您将该行重构为

    public void aMethod(Set<Object> panels) {
    
    public void-aMethod(设置面板){
    

    它仍将像以前一样编译,作为额外的奖励,您将不再有“Set is raw…”警告如果你先添加一个
    整数,然后再尝试添加一个
    字符串,它会被一个
    ClassCastException炸掉。@Sahil Muthoo:oops,我实际上没有想到
    TreeSet
    特别是,你是对的。我现在已经澄清了。设置一个可以初始化的集合,无论它的类型与S不同设置一个只能初始化为通用类型的集合_Object@Andrei:我不明白。你是在说
    Set
    Set
    的区别吗?如果是的话,那么我认为这与问题无关。
    Set vals=new TreeSet()
    如果你先添加一个
    整数,然后再尝试添加一个
    字符串,它会被一个
    ClassCastException炸掉。@Sahil Muthoo:oops,我实际上没有想到
    TreeSet
    特别是,你是对的。我现在已经澄清了。设置一个可以初始化的集合,无论它的类型与S不同设置一个只能初始化为通用类型的集合_Object@Andrei:我不明白。你是在说
    Set
    Set
    的区别吗?如果是的话,那么我认为这与问题无关。很好!你永远不应该低估代码重构准备的重要性。很好!你不应该r低估了代码重构准备的重要性。