我正在撰寫一個類Baz<T>,其函式宣告類似于以下內容:
public SomeClass1<T> foo(T); // Overload #1
public SomeClass1<T> foo(T, SomeClass1<T>); // Overload #2
public SomeClass1<T> foo(T, SomeClass1<T>, SomeClass1<T>); // Overload #3
由于 #1 是唯一使用的函式this,我可以制作所有其他函式static:
public SomeClass1<T> foo(T);
public static <T> SomeClass1<T> foo(T, SomeClass1<T>); //#2 and #3 now static
public static <T> SomeClass1<T> foo(T, SomeClass1<T>, SomeClass1<T>);
但是,這會使呼叫不同的foo多載不一致。我可以簡單地讓 #1 取一個Baz(而不是this),但似乎:
baz.foo(t);
比以下更多的語法糖:
Baz.foo(baz, t);
如果我不將 #2 和 #3 設為靜態,則無法防止以下情況:
Baz<Bar> baz1 = new Baz<Bar>(); // Bar is any class type; replaces T
Baz<Bar> baz2 = new Baz<Bar>();
SomeClass1<Bar> sc = new SomeClass1<Bar>(baz1); // make a SomeClass1 that is somehow attached to baz1; however, SomeClass1 does NOT keep a reference to baz1
baz2.foo(new Bar(), sc); // runs and compiles just fine!
我最終嘗試做的是為每個多載一個非靜態和一個靜態多載,其中非靜態多載簡單地委托給靜態:
public SomeClass1<T> foo(T); // All non-static overloads delegate to the corresponding static overload
public SomeClass1<T> foo(T, SomeClass1<T>);
public SomeClass1<T> foo(T, SomeClass1<T>, SomeClass1<T>);
public static <T> SomeClass1<T> foo(T, Baz<T>); // Baz could be first or last argument
public static <T> SomeClass1<T> foo(T, SomeClass1<T>);
public static <T> SomeClass1<T> foo(T, SomeClass1<T>, SomeClass1<T>);
我從多載 #2、#3 及其相應的靜態多載的宣告中得到以下錯誤,替換my-method-signature為相應的方法簽名和my-class-namewithBaz<T>或我正在使用的資料型別:
方法 my-method-signature 的擦除與 my-class-name 型別中的另一個方法相同
問題:
- 有沒有比我正在嘗試或想要做的更好的選擇?有可能完成我正在嘗試的事情嗎?如果是這樣,如何?
- 我正在嘗試做的事情(即,使語法保持一致并使無法呼叫具有“不匹配”
SomeClass1<T>和this物件的方法)甚至值得嗎?
PS 很抱歉發了這么長的帖子。
uj5u.com熱心網友回復:
是的,有一個更好的選擇:什么都不做。
擁有一種不需要this完成其作業的方法并沒有錯。這是一個實作選擇,它與實體履行其實作方法的契約無關。
有很多常用的設計模式都有這樣的方法。以各種工廠模式為例——它們的方法有一個回傳實體的契約。沒有人知道或關心他們是否this用來完成作業。
uj5u.com熱心網友回復:
不,你不能。
8.4.2. 方法簽名兩個方法或建構式,M 和 N,如果它們具有相同的名稱、相同的型別引數(如果有的話)(第 8.4.4 節),并且在將 N 的形參型別適應于M的型別引數,形式引數型別相同。
方法 m1 的簽名是方法 m2 簽名的子簽名,如果:
m2 與 m1 具有相同的簽名,或
m1 的簽名與 m2 的簽名的擦除(第 4.6 節)相同。
兩個方法簽名 m1 和 m2 是覆寫等效的,如果 m1 是 m2 的子簽名或 m2 是 m1 的子簽名。
在一個類中宣告兩個具有覆寫等效簽名的方法是編譯時錯誤。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340836.html
上一篇:帶鎖的Java條件
