第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何實(shí)例化泛型類型?

如何實(shí)例化泛型類型?

交互式愛情 2023-06-08 20:55:06
我正在為 Java 項(xiàng)目制作一些數(shù)學(xué)課程。我有一個(gè) Vector3 類,但我還需要 Vector4 和 Vector2,但顯然我不想復(fù)制粘貼我的代碼 3 次。所以我所做的是一個(gè) Vector 類,它將成為所有向量的母類。我可以只使用沒有子類的 Vector 類,但我更喜歡使用這些子類,因?yàn)槲铱梢栽谒鼈兩厦嫣砑犹囟ǖ臇|西,比如 Vector3 中的歐拉角操作,而且我想使用 Vector4 作為四元數(shù)的母類。無論如何,這是我簡(jiǎn)化的 Vector 類:public class Vector {    public double[] values;    public Vector(double[] values) {        this.values = values;    }    public int getLength() {         return values.length;     }    public static <T extends Vector> T multiply(T vector, double k) {        double[] values = new double[vector.getLength()];        for(int i = 0; i < values.length; i++)            values[i] = k* vector.values[i];        return new T(values);    }}public class Vector3 extends Vector {    public Vector3(double[] values) {        super(values);    }}問題是編譯器不會(huì)讓我實(shí)例化一個(gè) T:“類型參數(shù) T 不能直接實(shí)例化”。但是我需要這個(gè) T 因?yàn)槲倚枰祷氐南蛄颗c發(fā)送的向量類型相同。如果我執(zhí)行 new Vector2(4,2).multiply(42),我需要得到一個(gè) Vector2 而不是一個(gè) Vector。我還可以在 Vector2 中創(chuàng)建一個(gè)乘法方法,該方法調(diào)用 Vector multiply,然后將值復(fù)制到 Vector2 中,但是 1. 這很糟糕,2. 這意味著子向量之間有很多復(fù)制粘貼,3. 我需要性能,所以那不理想。我知道我可以使用反射來解決問題,但這些方法對(duì)性能至關(guān)重要,所以我必須盡可能簡(jiǎn)單。我還考慮過更改參數(shù)中的向量,這樣我就不必實(shí)例化一個(gè)新的向量,但這是一個(gè)非常糟糕的主意,因?yàn)樗鼤?huì)導(dǎo)致奇怪的行為。任何幫助表示贊賞。
查看完整描述

2 回答

?
當(dāng)年話下

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊

最簡(jiǎn)單的方法似乎是在Vector類上有一個(gè)實(shí)例方法:


Vector make(double[] values) {

  return new Vector(values);

}

然后在每個(gè)子類中覆蓋它,使用協(xié)變返回類型:


class Vector3 extends Vector {

  //...


  @Override Vector3 make(double[] values) {

    return new Vector3(values);

  }


  //...

}

然后你可以在你的 multiply 方法中調(diào)用它。


return vector.make(values);

但老實(shí)說,我不會(huì)嘗試將向量的長度編碼為類型。當(dāng)你需要一個(gè)包含 57032 個(gè)元素的向量時(shí)會(huì)發(fā)生什么?您肯定不想為此創(chuàng)建一個(gè)特定的類,對(duì)嗎?如果您有兩個(gè)Vector具有相同數(shù)量元素的不同子類,會(huì)發(fā)生什么情況:它們是否兼容(例如相加)?


更自然地處理向量的語言(例如 MATLAB)不會(huì)將其構(gòu)建到類型中;問問自己是否真的需要這里。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
LEATH

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊

如果它對(duì)性能至關(guān)重要,您實(shí)際上可能會(huì)考慮讓 multiply 方法改變向量的狀態(tài),而不是創(chuàng)建一個(gè)新的。在我看來,這并不奇怪,只要它是確定性的和記錄在案的行為即可。

但是,對(duì)于不可變向量類,您需要clone向量。

public class Vector implements Cloneable {

? ? // not a good idea to make it public, if you don't want any changes here

? ? private double[] values;


? ? public static <T extends Vector> T multiply(T vector, double k) {

? ? ? ? Vector temp = vector.clone();

? ? ? ? for(int i = 0; i < temp.values.length; i++)

? ? ? ? ? ? temp.values[i] = k * temp.values[i];

? ? ? ? // the clone method guarantees that 'temp' is of type T,

? ? ? ? // but since it is not generic, the compiler cannot check it

? ? ? ? @SuppressWarnings("unchecked")?

? ? ? ? T result = (T)temp;

? ? ? ? return result;

? ? }


? ? protected Vector clone() {

? ? ? ? try {

? ? ? ? ? ? Vector vector = (Vector)super.clone();

? ? ? ? ? ? vector.values = Arrays.copyOf(values, values.length);

? ? ? ? ? ? return vector;

? ? ? ? } catch (final CloneNotSupportedException exc) {

? ? ? ? ? ? // this is a weird design choice of `Object.clone()`, too,

? ? ? ? ? ? // but back then, we did not have annotations or anything equivalent

? ? ? ? ? ? throw new AssertionError("we forgot to implement java.lang.Cloneable", exc);

? ? ? ? }

? ? }

}


查看完整回答
反對(duì) 回復(fù) 2023-06-08
  • 2 回答
  • 0 關(guān)注
  • 210 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)