方法:
public static <K, V> List<K> collectListByValueMethod(List<V> list, String keyMethodName, Class<V> clazz) {
List<K> result = new ArrayList<K>();
if (list != null) {
try {
Method keyMethod = clazz.getMethod(keyMethodName);
for (V item : list) {
result.add((K) keyMethod.invoke(item));
}
} catch (Exception e) {
log.error(e.getMessage());
}
}
return result;
}
呼叫:
public class demo19 {
public static void main(String[] args) {
Person person1 = new Person(1, "li", 20, false);
Person person4 = new Person(2, "ol", 25, false);
Person person7 = new Person(3, "zhang", 30, true);
List<Person> list = new ArrayList<>();
list.add(person1);
list.add(person4);
list.add(person7);
List<Long> result= CollectionUtils.collectListByValueMethod(list, "getId", Person.class);
System.out.println(result);
}
}
getId回傳值是Integer,result期望回傳值是Long型別的集合,而實際情況是Integer型別的,應如何修改使result的實際泛型為Long?
uj5u.com熱心網友回復:
如果想設定回傳值的型別 就把K也放到引數里面去 呼叫的時候就能宣告了uj5u.com熱心網友回復:
我把 Class<K> kClass 作為 引數傳入的,呼叫時這里放的是Long.class ,但是在最后仍無法獲取期望的Long型別的集合uj5u.com熱心網友回復:
你看下我的代碼可以正常運行
public class adsadas {
public static void main(String[] args) {
Person person1 = new Person(1, "li", 20, false);
Person person4 = new Person(2, "ol", 25, false);
Person person7 = new Person(3, "zhang", 30, true);
List<Person> list = new ArrayList<>();
list.add(person1);
list.add(person4);
list.add(person7);
List<Long> result= collectListByValueMethod(list, "getId", Person.class);
System.out.println(result);
}
public static <K, V> List<K> collectListByValueMethod(List<V> list, String keyMethodName, Class<V> clazz) {
List<K> result = new ArrayList<K>();
if (list != null) {
try {
Method keyMethod = clazz.getMethod(keyMethodName);
for (V item : list) {
result.add((K) keyMethod.invoke(item));
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
static class Person{
private long id;
public Person(long i, String li, int i1, boolean b) {
id=i;
}
public long getId() {
return id;
}
}
}
uj5u.com熱心網友回復:
我的 getId()回傳值是Integer
public class Person {
private Integer id;
private String name;
private int age;
private boolean home;
public Person() {
}
public Person(Integer id, String name, int age, boolean home) {
this.id = id;
this.name = name;
this.age = age;
this.home = home;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isHome() {
return home;
}
public void setHome(boolean home) {
this.home = home;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", home=" + home +
'}';
}
}
uj5u.com熱心網友回復:
(K) keyMethod.invoke(item)這里的 (K)似乎沒有起作用
uj5u.com熱心網友回復:
你把Integer型別和int改為Long就行了,不知道你為什么在糾結????你想要long型別,但是Person內部是int型別,不一致,怎么能達到你要的效果呢
uj5u.com熱心網友回復:
老代碼 難改
uj5u.com熱心網友回復:
for(Integer i : list<Integer>){result.add(Long.valueof(i))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/29495.html
標籤:Java EE
