【发布时间】:2019-03-10 01:59:21
【问题描述】:
我正在将最初用 C# 编写的框架重写为 Java,这让我很困惑。这是一种使用反射来返回使用 LINQ 实现特定接口的类中的任何属性的方法:
public List<TInterface> GetElementsOfType<TInterface>()
{
return GetType().GetProperties()
.Where(x => typeof(TInterface).IsAssignableFrom(x.PropertyType))
.Select(x => x.GetValue(this, null)).OfType<TInterface>()
.ToList();
}
我正在尝试在 Java 中重新创建,并且到目前为止有这个。不太确定它是否正确?:
public <T> List<?> GetElementsOfType(Class<T> klazz) {
Class<?> props = this.getClass();
List<T> elementsOfType = new ArrayList<>();
try {
Field fieldlist[] = props.getDeclaredFields();
for (Field aFieldlist : fieldlist) {
if (aFieldlist.getType().isAssignableFrom(klazz)){
elementsOfType.add((T)aFieldlist);
}
}
} catch (Exception e) {
return null;
}
return elementsOfType;
}
更新:感谢大家的帮助。这似乎对我有用,尽管未经检查的演员表会导致我不得不压制的警告:
@SuppressWarnings("unchecked")
public <T> List<T> GetElementsOfType(Class<T> klazz) {
Class<?> props = this.getClass();
List<T> elementsOfType = new ArrayList<>();
try {
Field fieldlist[] = props.getDeclaredFields();
for (Field aFieldlist : fieldlist) {
if (klazz.isAssignableFrom(aFieldlist.getType())){
elementsOfType.add((T) aFieldlist.get(this));
}
}
} catch (Exception e) {
return elementsOfType;
}
return elementsOfType;
}
}
【问题讨论】:
-
如果您使用的是 java 8,您可以查看 java 8 流,它几乎可以和上面的 C# 版本做同样的事情
-
是的,使用 Java 8,没有研究流
-
您希望参数到
isAssignableFrom的顺序与 C# 中的顺序相同
标签: java reflection interface