作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难进一步简化问题。抱歉,如果这里的代码太多。我尝试改进上面代码的架构,因为我讨厌警告和强制转换,并且感觉有些不对劲。
现在,代码。我有一个带有这两个参数化方法的 util 类(与 OpenJPA 的 CriteriaBuilder 具有相同的签名...)
public class MyUtil {
public void equal(List<?> l, Object value) {
// do something (see CriteriaBuilder.equal method)
}
public <Y extends Comparable<? super Y>> void greaterThan(List<? extends Y> l, Y value) {
// do something (see CriteriaBuilder.greaterThan method)
}
}
然后,我希望能够抽象它们以通过接口(interface)调用它。
public interface IOperation<T> {
// maybe make this method generic ? but how ?
public abstract void doOp(List<T> l, T value);
}
public abstract class AbstractOperation<T> implements IOperation<T> {
protected MyUtil myUtil;
}
public class EqualOp extends AbstractOperation<Object> {
@Override
public void doOp(List<Object> path, Object value) {
myUtil.equal(path, value);
}
}
public class GreaterThanOp<T extends Comparable<? super T>> extends AbstractOperation<T> {
@Override
public void doOp(List<T> path, T value) {
myUtil.greaterThan(path, value);
}
}
我创建了一个工厂
public class OperationFactory {
private static OperationFactory instance;
public static OperationFactory getInstance() {...}
public IOperation<?> get(String op) {
if ("=".equals(op)) {
return new EqualOp();
} else if (">".equals(op)) {
return new GreaterThanOp<Comparable<? super Object>>();
}
throw new InvalidParameterException();
}
}
然后我使用它:
public class Client {
public void needOp(String op) {
IOperation<String> operation = (IOperation<String>) OperationFactory.getInstance().get(op); // How to avoid this cast ?
List<String> l = null;
operation.doOp(l, "a string");
}
}
我的问题是:是否可以在 Client 类中避免这种转换?如何 ?有没有办法拥有更好的架构?
感谢您的阅读
最佳答案
我假设您可以要求您的类型可比较
。
像GreaterThanOp
一样参数化EqualOp
:
public class EqualOp<T extends Comparable<T>> extends AbstractOperation<T> {
@Override public void doOp(List<T> path, T value) ...
并像这样定义get()
:
public <T extends Comparable<T>> IOperation<T> get(String op) {
if ("=".equals(op)) {
return new EqualOp<T>();
} else if (">".equals(op)) {
return new GreaterThanOp<T>();
}
...
关于java - 避免在泛型层次结构中进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22949031/
我是一名优秀的程序员,十分优秀!