簡體   English   中英

超類或泛型

[英]Superclass or Generic Type

我需要能夠理解在Java環境中使用哪種方法(下面列出)會更有利。

因此,我的問題是:我正在創建一個用於容納多個相同類型對象的類,但是如果將來我想使用它,我希望能夠將不同的對象傳遞給不同的實例。 Array2D。 它的名稱是Array2D,並包含名為rowscolumns私有實例變量。 但是,我想做的是能夠將任何對象(在實例化時)傳遞給此類,並能夠使用Array2D內部的方法返回相同的類型。

方法1
使用泛型類型創建Array2D。 https://docs.oracle.com/javase/tutorial/java/generics/types.html

方法2
創建一個可以擴展為直接傳遞給Array2D的超類。

方法1的示例:

public class Array2D<T> {
    private int rows;
    private int columns;
    private T[] t;

    public Array2D(int rows, int columns) {
        this.rows = rows;
        this.columns = columns;
    }

    public T[] returnSomething() {
        return t;
    }
}

方法2的示例:

Arrayable.java

public class Arrayable {
    //all of my variables for arrayable class
}

范例.java

public class Example extends Arrayable {
    //more stuff
}

Array2D.java

public class Array2D {
    private int rows;
    private int columns;
    private Arrayable[] arrayable;

    public Array2D(Arrayable[] arr) {
        this.arrayable = arr;
    }

    public Arrayable[] returnSomething() {
        return arrayable;
    }
}

Main.java

public class Main {
    public static void main(String args[]) {
        Example ex1 = new Example();
        Example ex2 = new Example();
        Example[] ex3;

        ex3[0] = ex1;
        ex3[1] = ex2;

        Array2D a2d = new Array2D(ex3);
        Example[] finish = a2d.returnSomething();
    }
}

我對方法2看到的唯一問題是,對於要提供給Array2D的任何類,它都必須擴展Arrayable。 哦,這需要花費兩倍的時間。 輸入??

如果在這種情況下可以采用方法1,請提供示例。 我基本上是泛型類的新手並對其進行設置。 謝謝!

據我了解,您希望它對所有類型的對象都是通用的,但是在實例化它時,它應該只接受聲明類型的子類。 如果是這種情況,請使用泛型。 實例化它之后,它將自動接受已定義類型的子類。

基本上,使用第一種方法。 然后像這樣更改您的main

public class Main {
    public static void main(String args[]) {

        Arrayable[] classArray = {
            new SubClass1(),
            new SubClass2()
        };

        Array2D<Arrayable> a2d = new Array2D<>(classArray);
        Arrayable[] array = a2d.returnSomething();
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM