generics 相关问题

泛型是一种参数多态,可以在各种语言中找到,包括.NET语言,Java和Swift。

为什么不应用类型推断?

在这种情况下,类型推断按预期工作,T 类型参数同时处理 Integer 和 String: 公共A类{ 公共静态 void func(T obj1, T obj2) {} 公共静态...

回答 1 投票 0

为什么接口方法的实现不能返回应用了正确约束的泛型参数类型? (C#)

给出以下代码: 公共接口 IFoo {} 公共接口IBar { IFoo MyMethod(); } 公共抽象类 MyClass : IBar 其中 T : IFoo { 公共抽象 T MyMethod(...

回答 1 投票 0

如何为打字稿中的嵌套对象递归实现对象所需的至少一个属性

对于我正在开发的一个项目,我要求至少使用对象中的一个属性来定义我的对象 例如下面是定义这些选项的类型 类型 DraggableOptions = {

回答 1 投票 0

具有上限泛型参数的函数

以下两个功能是等价的还是有区别? 公共静态无效foo(列表动物) 公共静态 void foo(List an...

回答 1 投票 0

在不使用反射的情况下从具体化泛型中获取价值

我正在构建一个必须对值进行编码(INT4 -> ByteArray 作为示例)和解码值(ByteArray -> INT4 作为示例)的驱动程序 我有两个接口,可编码和可解码(精简 h...

回答 1 投票 0

Optional.of 方法是否进行类型转换?

类测试{ 公共静态无效主(字符串[] args){ 可选 opY = 可选.of( new Y() ) ; // 错误 可选 opX =(可选)opY ; } ...

回答 1 投票 0

可选返回类型:尝试使用不兼容的返回类型

代码如下,如何修复。谢谢! 接口A { 可选 get() ; } 接口 B 扩展 A { // 错误,“test.B”中的“get()”与“test.A”中的“get()”冲突;尝试...

回答 1 投票 0

泛型返回类型必须是它本身

代码如下,如何修复。谢谢! 接口A { 可选 get() ; } 接口 B 扩展 A { // 错误,“test.B”中的“get()”与“test.A”中的“get()”冲突;尝试...

回答 1 投票 0

泛型类型就是它本身

代码如下,如何修复。谢谢! 接口A { 可选 get() ; } 接口 B 扩展 A { // 错误,“test.B”中的“get()”与“test.A”中的“get()”冲突;尝试...

回答 1 投票 0

泛型中无界类型参数的规则(C#)

我是泛型新手 我开始从 Microsoft 网站学习泛型 我无法理解以下有关无界类型参数的要点。 输入没有约束的参数,例如 T in ...

回答 1 投票 0

“通用类”的“对象”实例[重复]

为什么编译会出错 java:不兼容的类型:自定义无法转换为通用 在这一行中生成:System.out.println(custom instanceof Generic);? 为什么instanceof会有这样的行为

回答 1 投票 0

名称冲突有相同的删除

我搜索过其他类似的问题,但我认为它们没有涵盖这一点。我有以下代码,这导致了编译错误: // 示例 1(不起作用) 公共接口I 我搜索过其他类似的问题,但我认为它们没有涵盖这一点。我有以下代码,这导致编译错误: // Example 1 (not working) public interface I<T extends Number> { void method(Map<String, String> map, T value); } public abstract class A<T extends Number> implements I<T> { @Override public void method(Map<String, String> map, T value) {} } // Note that C doesn't know about the generic type public class C extends A { // Error: name clash: method(Map<String,String>,Number) in C and // method(Map,Number) in A have the same erasure, yet neither overrides the other @Override public void method(Map<String, String> map, Number n) {} } 我理解类型擦除,但是当我“手动”类型擦除时,它可以工作,所以这段代码很好。 // Example 2 (working) public interface I<T extends Number> { void method(Map map, T value); } public abstract class A<T extends Number> implements I<T> { @Override public void method(Map map, T value) {} } public class C extends A { // No error @Override public void method(Map map, Number n) {} } 大概泛型 T 也不是问题,因为如果我删除 Map 参数它就可以工作,所以这也很好,(无论如何,错误是抱怨 Map 而不是泛型类型,所以这并不奇怪) : // Example 3 (working) public interface I<T extends Number> { void method(T value); } public abstract class A<T extends Number> implements I<T> { @Override public void method(T value) {} } public class C extends A { // No error @Override public void method(Number n) {} } 但是删除类型参数也可以修复它,所以问题也不是地图,我猜: // Example 4 (working) public interface I { void method(Map<String, String> map); } public abstract class A implements I { @Override public void method(Map<String, String> map) {} } public class C extends A { @Override public void method(Map<String, String> map) {} } 这是一个小例子,但出现这个问题是因为我试图将泛型类型 T 添加到接口中,而不需要更改 C,这是在我无法控制的代码中实现的,因此以不兼容的方式更改 I 或 A使用 C 的方式不是一个选项,但我希望能够在升级为使用泛型的类中使用泛型。我本以为这会起作用,并且用现有类型添加带有约束的泛型将是向后兼容的更改,并且在大多数地方都是如此,因为遵循示例 3 中形式的方法可以正常工作。 无论如何,我不确定这里的错误到底是什么,因为示例3有效,任何关于一般形式无效的理论似乎都是不正确的,但由于示例2有效,它也感觉这与类型无关擦除,但也许泛型和类型擦除之间有一些有趣的交互,我不知道。 您可以通过将 A 分成两部分,留下 A 不带泛型定义,并添加一个处理泛型的新超类型来解决第一个示例中的问题: // Rename A as SuperA public class SuperA<T extends Number> implements I<T> { @Override public void method(Map<String, String> map, T value) {} } // Insert new A which hasn't got the generic A<T> but declares T as Number for C public class A extends ASuper<Number> { @Override public void method(Map<String, String> map, Number value) {} } 这具有为类 Number 提供正确类型 C 的效果,您无法更改该类型。

回答 1 投票 0

为什么我的 lambda 表达式可以编译,而等效方法引用却不能编译?是仿制药有问题还是我有问题?

我正在尝试将方法引用与泛型类一起使用,并且注意到我可以使其与等效的 lambda 表达式一起使用,但不能与方法引用一起使用。我想知道是否有人可以

回答 1 投票 0

使用泛型从打字稿中的对象属性推断枚举

我有一个场景,我想从其架构 ID 验证命令并返回类型化的验证结果。为此,我需要能够推断架构 id 的枚举值。 我知道我可以使用

回答 1 投票 0

Java 泛型:声明泛型类型的映射值

我是仿制药新手。 有一张像这样的地图 私有静态Map地图; 和一个像这样的方法 公共 T getObject(final Class myClass) { 返回 (T)map.get(myCla...

回答 4 投票 0

为什么这些函数擦除后类型相同?

def merge[X](list1: 选项[List[X]], list2: 选项[List[X]]): 选项[List[X]] def merge[X](list1: 选项[List[X]], elem: 选项[X]): 选项[List[X]] 编译器说这两个函数有

回答 1 投票 0

C# 泛型匹配抽象类类型时出现的问题

我试图运行这段代码,但是当我尝试检查时,存在一个问题:对象的类型与其抽象类类型不匹配 它在“if(处理程序是处理程序 我试图运行这段代码,但是当我尝试检查时,存在一个问题,即对象的类型与其抽象类类型不匹配 它位于“if (handler is Handler h)”这一行 void Main() { var requestHandler = new RequestHandler(); var result = requestHandler.Handle(new GetAge()); Console.WriteLine(result); } public interface IRequest<T> { } public class GetAge : IRequest<int> { } public interface IHandler {} public abstract class Handler<TRequest, TResponse> : IHandler where TRequest : IRequest<TResponse> { public TResponse Handle(IRequest<TResponse> request) { return Handle((TRequest)request); } protected abstract TResponse Handle(TRequest requst); } public class GetAgeHandler : Handler<GetAge, int> { protected override int Handle(GetAge request) { return 20; } } public class RequestHandler { public Dictionary<Type, IHandler> requestHandlers = new() { [typeof(GetAge)] = new GetAgeHandler() }; public T Handle<T>(IRequest<T> request) { var handler = requestHandlers[request.GetType()]; if (handler is Handler<IRequest<T>, T> h) { return h.Handle(request); } return default; } } 看起来应该可以,但似乎我做错了什么 简单来说,模式匹配失败是因为泛型类型默认是不变的。即使您有Handler<GetAge, int>,也不认为与Handler<IRequest<int>, int>兼容。如果泛型类型是协变或逆变,那么这是允许的,但在这种特定情况下,这是不可能的。 解决此问题的一种方法是定义 Handle 方法,如下所示: public TResponse Handle<TRequest, TResponse>(TRequest request) where TRequest : IRequest<TResponse> { var handler = requestHandlers[request.GetType()]; if (handler is Handler<TRequest, TResponse> h) { return h.Handle(request); } return default(TResponse); } 你会这样称呼它: var result = requestHandler.Handle<GetAge, int>(new GetAge());

回答 1 投票 0

对象类型 System.collections.Generic.List 不存在映射

错误:发生 System.ArgumentException H结果=0x80070057 消息 = 对象类型 System.Collections.Generic.List`1 不存在映射[[System.Object、mscorlib、Version=4.0.0.0、Culture=neutr...

回答 1 投票 0

在 T 中为 T 的所有可能值注册一次泛型 bean

我正在寻找一种在 T 中注册一次泛型类 bean 的方法,以便它在 IoC 容器中可用于 T 的所有可能值。 一个例子如下(我正在使用 java 17...

回答 1 投票 0

我可以采取什么步骤来修复“参数化类‘Class’的原始使用”警告?

在下面的程序中,我有类 Cow、派生自类 Cow 的类 Dragon 和类派生自类 Dragon 的 IceDragon。 还有HeiferGenerator类,负责创建数组

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.