我有一個專案類
public class Item {
Long id;
String name;
Boolean isGood;
// getters and setters
}
我想宣告一個可以將方法參考和一些值作為引數的方法。
我試過的
public class Main {
public static void main(String[] args) {
Item item = new Item();
setLong(item::setId, 123L);
setBool(item::setGood, true);
setString(item::setName, "Foo Bar");
}
static void setLong(Consumer<Long> setter, Long o) {
setter.accept(o);
}
static void setBool(Consumer<Boolean> setter, Boolean o) {
setter.accept(o);
}
static void setString(Consumer<String> setter, String o) {
setter.accept(o);
}
}
但我想要類似的東西
set(Long.class, item::setId, 123L);
set(Boolean.class, item::setGood, true);
set(String.class, item::setName, "Foo Bar");
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
嘗試這個。
import java.util.function.Consumer;
public class SOQ_20220528
{
public static class Example
{
private Short a;
private Integer b;
private Long c;
public Example() {}
public Short getA() {
return this.a;}
public Integer getB() {
return this.b;}
public Long getC() {
return this.c;}
public void setA(Short a) {this.a = a;}
public void setB(Integer b) {this.b = b;}
public void setC(Long c) {this.c = c;}
public String toString() {
return this.a " " this.b " " this.c; }
}
public static void main(String[] args)
{
final Example instanceName= new Example();
final Short tuv = 1;
set(Short.class, instanceName::setA, Short.valueOf(tuv));
set(Integer.class, instanceName::setB, Integer.valueOf(2));
set(Long.class, instanceName::setC, Long.valueOf(3));
}
public static <T> void set(Class<T> clazz, Consumer<T> setter, T value)
{
setter.accept(value);
}
}
我們將我們想要使用的型別的 Class 作為第一個引數,然后我們將 setter 作為我們的第二個引數,最后,我們將希望我們的物件適應的字面值作為我們的第三個引數。
由于運行時型別擦除,第一個引數是必需的。Java 根本不會在運行時保留型別,所以我們只需要傳入 Class,它作為我們的運行時型別。
第二個引數是必需的,因為您需要一個 setter 來執行。但是,請注意我做了instanceName::setA
而不是Example::setA
. 由于這是我們提供消費者使用的代碼部分,因此我使用實體名稱而不是型別名稱。很多時候它實際上是相反的(一個例子是靜態方法)。
第三個引數是設定器引數的實際值。我將欄位設定a
為value 。那部分是我正在談論的第三個引數。instanceName
Short
1
1
編輯- 事實證明,對于這個特定示例,該Class<T>
引數不是必需的。為了簡化修改,我將保留它,但是是的,從技術上講,您可以使用這樣的方法頭來代替 -- public static <T> void set(Consumer<T> setter, T value)
,然后您將像以前一樣為該方法提供引數,只是沒有類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/483541.html