当前位置: 首页 > 知识库问答 >
问题:

跨相关Java类型的Java泛型参数

秦宏硕
2023-03-14

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

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

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

我还有一个表示该类型实例的值接口:

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

    @NotNull
    T getType();
}
public interface Value<J, T extends Type<J>> {
    J get();

    @NotNull
    T getType();
}

所以想象一下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 而不是NumericType ,那么上面的代码将在编译时失败。但是,我如何编写Value以便其Get()方法声明可以引用Type有界参数的界限呢?Value > 东西读起来真的很麻烦:

Value<BigDecimal, NumericType> foo;

我希望有更好的办法。

共有1个答案

司空奕
2023-03-14

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

  1. 它允许精确定义所需的操作
  2. 由于所需操作的减少,它允许很容易地调整内部表示。

这是基本的OOP概念和KISS原则(保持简单,愚蠢)。

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));
 类似资料:
  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 问题内容: 我正在定义一个类: 编译器抱怨被隐藏。我猜第二次出现在定义中是第一次隐藏在范围内,好像可以将变量分配给两种不同的类型一样。如何正确做? 编辑: 这是一个内部阶级。完整的代码可以是: 现在的问题是,如果我重新提名内部人,我不确定那是和实际上是相同的类型。 问题答案: 不要将内部类参数化: 作为声明中定义的内部(非静态嵌套)类,仍将具有in的含义,因为每个类都对其外部实例具有隐式引用。

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 此代码似乎正常工作 方法类型参数是否会遮盖类类型参数? 另外,在创建对象时,它是否使用类的type参数? 例 在它们 不冲突 的情况下,这通常适用于类的类型参数 吗? 我的意思是,当只有类具有类型参数而不是构造函数时,还是在构造函数中查找类型参数?如果他们 确实发生冲突 ,这将如何改变? 请参阅下面的讨论 如果我有一个函数调用 问题答案: 您所有的都不同,但是只有使用完整的语法调用方法

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。

  • 我正试图解决一个泛型问题。我在做一些手工选角,感觉好像我做错了什么。我对使用泛型有点陌生,所以很有可能我在某些方面误用了它们。如能提供指导,将不胜感激。 TLDR: 我有一个带有泛型方法的接口,该泛型方法采用参数。我在一个类中实现了这个接口,但在实现器中,我希望确保是特定类型的(假设,这样我就可以提取一些字段)。我怎么能那样做? 详细信息: 下面有一个接口和一个实现类,其中。 具有以下定义: 而具