我有一个表示数据元类型的接口类型。该参数指示将用于表示数据的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;
我希望有更好的办法。
我确认。在Java中不可能做到这一点。此外,如果兴趣在于隐藏给定的NumericType使用BigDecimal作为内部表示,那么使用专用对象实现所需操作的完整抽象将会更加简单和健壮。如果仅使用这些操作来操作对象,则可以更改内部表示,以便仅对该类的内部进行更改:
这是基本的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: 我有一个带有泛型方法的接口,该泛型方法采用参数。我在一个类中实现了这个接口,但在实现器中,我希望确保是特定类型的(假设,这样我就可以提取一些字段)。我怎么能那样做? 详细信息: 下面有一个接口和一个实现类,其中。 具有以下定义: 而具