抱歉有点迟回,谢谢!
AbsList.newInstance("string").go();
可以让程式动是因为 E 和 T 在 compilation time 可以被推定为 String。
但是
AbsList.newInstance("number").go();
程式执行结果应该是非预期的。
valueToAdd 恰如其名,但是我想要的参数是 typeToAdd。
在改过的 AbsList 中看起来借由让 generic type 由参数本身的 type 推定是合适的,
但是如果想由 typeToAdd 这个 string 来决定可以吗?
是不是不适合这样设计?
像是这样 (compiling error):
import java.util.ArrayList;
import java.util.List;
public class AbsList<T> {
private List<T> mList = new ArrayList<T>();
private String mType;
public AbsList(String type) {
mType = type;
}
public static <E> AbsList<E> newInstance(String type) {
switch (type) {
case "string":
return new AbsList<String>(type);
case "number":
return new AbsList<Number>(type);
default:
return new AbsList<Object>(type);
}
}
public void go() {
switch (mType) {
case "string":
mList.add("string");
break;
case "number":
mList.add(1);
break;
}
for (T element : mList) {
System.out.println(element.getClass().getName());
System.out.println(String.valueOf(element));
}
}
public static void main(String args[]) {
AbsList.newInstance("number").go();
}
}
※ 引述《adrianshum (Alien)》之铭言:
: public class AbsList<T> {
: private List<T> mList = new ArrayList<T>();
: private T valueToAdd;
: private AbsList(T valueToAdd) {
: this.valueToAdd = valueToAdd;
: }
: // 你本身的 factory method 不合理,修改成这样
: public static <E> AbsList<E> newInstance(E valueToAdd) {
: return new AbsList<E>(valueToAdd);
: }
: public void go() {
: this.mList.add(valueToAdd);
: for (T element : mList) {
: System.out.println(String.valueOf(element));
: }
: }
: public static void main(String args[]) {
: AbsList.newInstance("string").go();
: }
: }
: 或有点 syntax eror, 意思懂就好
: ※ 引述《changyuheng (张昱珩)》之铭言:
: : 希望下面的 mList 可以不 cast 直接使用,请问是不是做不到?
: : import java.util.LinkedList;
: : import java.util.List;
: : public class AbsList {
: : private List<?> mList;
: : private String mType;
: : public AbsList newInstance(String type) {
: : mType = type;
: : switch (type) {
: : case "String":
: : mList = new LinkedList<String>();
: : break;
: : case "Number":
: : mList = new LinkedList<Number>();
: : }
: : return this;
: : }
: : public void go() {
: : switch (mType) {
: : case "String":
: : ((List<String>) mList).add("A");
: : for (String s : (List<String>) mList)
: : System.out.println(s);
: : break;
: : case "Number":
: : ((List<Number>) mList).add(0);
: : for (Number n : (List<Number>) mList)
: : System.out.println("" + n);
: : }
: : }
: : public static void main (String[] args) {
: : new AbsList().newInstance("String").go();
: : }
: : }