我有以下课程:
public class HashmapArraylist {
public static void main(String[] args) throws Exception {
Map<String, Object> map1 = new HashMap<>();
map1.put("id", 1);
map1.put("sku", "test1");
map1.put("quantity", 1);
Map<String, Object> map2 = new HashMap<>();
map2.put("id", 2);
map2.put("sku", "test2");
map2.put("quantity", 2);
Map<String, Object> map3 = new HashMap<>();
map3.put("id", 3);
map3.put("sku", "test3");
map3.put("quantity", 3);
ArrayList<Map<String, Object>> arrayList = new ArrayList<>();
arrayList.add(map1);
arrayList.add(map2);
arrayList.add(map3);
printArrayList(arrayList);
}
public static void printArrayList(ArrayList<Map<String, Object>> arrayList) {
for (Map<String, Object> entry : arrayList) {
for (String key : entry.keySet()) {
String value = entry.get(key).toString();
System.out.println(key + " : " + value);
}
System.out.println("-----------");
}
}
}
我尝试像这样创建一个TestClass对象:
public class TestClass
{
public IEnumerable<Expression<Func<object, object>>> TestField { get; set; }
}
但我得到以下IntelliSense错误: 无法将类型'OtherClass'隐式转换为'object'
如何通过保持new TestClass
{
TestField = new Expression<Func<OtherClass, object>>[]
{
otherClass => otherClass.FieldX,
otherClass => otherClass.FieldY
}
}
定义的通用性来实现这一点,以便我可以创建一个TestClass
对象,例如TestClass
,OtherClass
或任何其他类?
答案 0 :(得分:2)
您不能将一种类型的泛型类强制转换为派生类型的泛型类。仅仅因为类的泛型类型通过继承连接并不意味着类本身就是。例如,您无法将List<Apple>
强制转换为List<Fruit>
,因为就程序而言,这两个列表是完全不同的类。
在您的情况下,您可以通过TestClass
本身通用来解决您的泛型问题:
public class TestClass<T>
{
public IEnumerable<Expression<Func<T, object>>> TestField { get; set; }
}
然后您可以像这样创建TestClass
的实例:
new TestClass<OtherClass>
{
TestField = new Expression<Func<OtherClass, object>>[]
{
otherClass => otherClass.FieldX,
otherClass => otherClass.FieldY
}
}
答案 1 :(得分:0)
喜欢这个吗?
new TestClass
{
TestField = new Expression<Func<object, object>>[]
{
otherClass => ((OtherClass)otherClass).FieldX,
otherClass => ((OtherClass)otherClass).FieldY
}
};