gpt4 book ai didi

跨依赖 Java 类型的 Java 通用参数

转载 作者:行者123 更新时间:2023-12-02 10:57:31 27 4
gpt4 key购买 nike

我有一个代表数据元类型的接口(interface) Type。该参数指示将用于表示数据的 Java 类型:

public interface Type<J> {
boolean isAssignableFrom(@NotNull Type ts);

/**
* Gets the Java class of the representation of this type.
*/
Class<? extends J> getValueType();
}

我还有一个代表该类型实例的值接口(interface):

public interface Value<T extends Type> {
<E> E get();

@NotNull
T getType();
}

我想要的是 Value接口(interface)强制 Type 上声明的参数界面。换句话说,我想要 get()方法声明其返回类型必须在 <J> 的范围内。但我无法想出任何方法来做到这一点而不添加 <J>Value接口(interface):

public interface Value<J, T extends Type<J>> {
J get();

@NotNull
T getType();
}

有什么办法可以制作get()引用其Type的有界参数,而不将其添加到 Value界面?这使得代码确实比我想要的复杂得多。

想象一下NumericType这是一个简单的类型来表示系统中的数字(除了运行时之外,不存在更复杂的动态类型,这就是元编程的乐趣):

/** A static type representing some kind of number. */
public class NumericType implements Type<BigDecimal>
{
public static final NumericType NUMERIC_TYPE = new NumericType();


public boolean isAssignableFrom(@NotNull Type t)
{
// logic here
}

public Class<BigDecimal> getValueType() {
return BigDecimal.class;
}
}

它告诉调用者系统中用于表示该类型的 Java 类型。如果我声明一个值 NumericType :

Value<NumericType> foo;

我希望能够具有 get() 的编译时安全性将始终返回 BigDecimal:

BigDecimal bar = foo.get();
这样,如果我需要更改给定类型的 Java 表示(例如,我想使用 NumericType<Number> 而不是 NumericType<BigDecimal>,上面的代码将在编译时失败。但是我如何编写 Value这样它的 get() 方法声明可以引用 Type 有界参数的边界? Value<J, Type<J>> 的东西读起来真的很困惑:

Value<BigDecimal, NumericType> foo;

希望有更好的方法。

最佳答案

我确认。在 Java 中不可能做到这一点。此外,如果想要隐藏给定的 NumericType 使用 BigDecimal 作为内部表示,那么使用专用对象实现所需操作的完整抽象会更简单、更健壮。如果仅使用这些操作来操作对象,则可以更改内部表示,以便唯一的更改是此类的内部:

  1. 它允许精确定义所需的操作
  2. 由于减少了所需的操作集,因此可以轻松调整内部表示。

这是基本的 OOP 概念和 KISS 原则(Keep It Simple,Stupid)。

class NumericType {
private int value;
public NumericType(int initial) {...}
public NumericType add(NumericType operand) {...}
...
}

那么就可以这样使用

NumericType bar = new NumeicType(1);
bar = bar.add(new NumericType(1));

关于跨依赖 Java 类型的 Java 通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19298328/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com