标签: generics

创建泛型类型的实例?

如果BaseFruit有一个接受一个的构造函数,int weight我可以用这样的泛型方法实例化一块水果吗?

public void AddFruit<T>()where T: BaseFruit{
    BaseFruit fruit = new T(weight); /*new Apple(150);*/
    fruit.Enlist(fruitManager);
}
Run Code Online (Sandbox Code Playgroud)

注释后面添加了一个示例.如果我给出BaseFruit一个无参数构造函数然后通过成员变量填充所有内容,我似乎只能这样做.在我的真实代码中(不是关于水果),这是不切实际的.

-Update-
所以它似乎无法以任何方式通过约束来解决.从答案中有三种候选解决方案:

  • 工厂模式
  • 反射
  • 活化剂

我倾向于认为反射是最不干净的,但我不能在其他两个之间做出决定.

.net c# generics

212
推荐指数
7
解决办法
20万
查看次数

C#和Java中的泛型与C++中的模板有什么区别?

我主要使用Java和泛型相对较新.我一直在阅读Java做出错误决定或者.NET有更好的实现等.

那么,泛型中C++,C#,Java之间的主要区别是什么?每个人的利弊?

c# c++ java generics templates

203
推荐指数
6
解决办法
5万
查看次数

使用lambda表达式将对象列表从一种类型转换为另一种类型

我有一个foreach循环读取一种类型的对象列表并生成一个不同类型的对象列表.我被告知lambda表达式可以达到相同的效果.

var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激 - 我是lambda和linq的新手谢谢,s

c# generics lambda

202
推荐指数
7
解决办法
21万
查看次数

Java泛型的类型参数中的问号是什么意思?

这是从斯坦福分析器附带的一些示例中获取的一小段代码.我已经用Java开发了大约4年,但是从来没有对这种代码风格应该表明什么有非常强烈的理解.

List<? extends HasWord> wordList = toke.tokenize();
Run Code Online (Sandbox Code Playgroud)

我并不担心代码的细节.令我困惑的是,通用表达式应该用英语表达的是什么.

谁可以给我解释一下这个?

java generics

202
推荐指数
5
解决办法
10万
查看次数

该类型必须是引用类型,以便在泛型类型或方法中将其用作参数"T"

我正在深入研究仿制药,现在我需要帮助.我在下面的'Derived'类中遇到编译错误,如主题标题所示.我看到很多其他类似的帖子,但我没有看到这种关系.有人能告诉我如何解决这个问题吗?

using System;
using System.Collections.Generic;


namespace Example
{
    public class ViewContext
    {
        ViewContext() { }
    }

    public interface IModel
    {
    }

    public interface IView<T> where T : IModel 
    {
        ViewContext ViewContext { get; set; }
    }

    public class SomeModel : IModel
    {
        public SomeModel() { }
        public int ID { get; set; }
    }

    public class Base<T> where T : IModel
    {

        public Base(IView<T> view)
        {
        }
    }

    public class Derived<SomeModel> : Base<SomeModel> where SomeModel : IModel
    {

        public Derived(IView<SomeModel> …
Run Code Online (Sandbox Code Playgroud)

c# generics

200
推荐指数
3
解决办法
11万
查看次数

克隆/深度复制.NET泛型字典<string,T>的最佳方法是什么?

我有一个通用词典词典,我想基本上做一个克隆()的任何建议.

c# generics collections clone

191
推荐指数
8
解决办法
16万
查看次数

什么时候Java泛型要求<?扩展T>而不是<T>并且是否存在切换的缺点?

给出以下示例(使用带有Hamcrest匹配器的JUnit):

Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<java.util.Date>> result = null;
assertThat(result, is(expected));  
Run Code Online (Sandbox Code Playgroud)

这不能使用JUnit assertThat方法签名编译:

public static <T> void assertThat(T actual, Matcher<T> matcher)
Run Code Online (Sandbox Code Playgroud)

编译器错误消息是:

Error:Error:line (102)cannot find symbol method
assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>,
org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class
    <? extends java.io.Serializable>>>)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将assertThat方法签名更改为:

public static <T> void assertThat(T result, Matcher<? extends T> matcher)
Run Code Online (Sandbox Code Playgroud)

然后编译工作.

所以有三个问题:

  1. 为什么当前版本没有编译?虽然我模糊地理解这里的协方差问题,但如果必须的话,我当然无法解释它.
  2. assertThat方法更改为Matcher<? extends T>?是否有任何缺点?如果你这样做,还有其他案例会破裂吗?
  3. assertThat在JUnit 中对方法进行泛化是否有任何意义?该Matcher级似乎并不需要它,因为JUnit的调用matches方法,它不与任何普通类型的,只是看起来像一个企图迫使一个类型安全这并不做任何事情,因为Matcher实际上只会不匹配,无论如何测试都会失败.不涉及不安全的操作(或似乎如此).

供参考,以下是JUnit的实现assertThat:

public static <T> void assertThat(T actual, Matcher<T> matcher) {
    assertThat("", …
Run Code Online (Sandbox Code Playgroud)

java generics junit

191
推荐指数
6
解决办法
31万
查看次数

通用TryParse

我正在尝试创建一个通用扩展,使用'TryParse'来检查字符串是否是给定类型:

public static bool Is<T>(this string input)
{
    T notUsed;
    return T.TryParse(input, out notUsed);
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译,因为它无法解析符号'TryParse'

据我了解,'TryParse'不是任何界面的一部分.

这有可能吗?

更新:

使用下面的答案,我想出了:

public static bool Is<T>(this string input)
{
    try
    {
        TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
    }
    catch
    {
        return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

它运作得很好,但我认为以这种方式使用异常对我来说感觉不对.

UPDATE2:

修改为传递类型而不是使用泛型:

public static bool Is(this string input, Type targetType)
{
    try
    {
        TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
        return true;
    }
    catch
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# generics tryparse

191
推荐指数
7
解决办法
7万
查看次数

如何在xml文档中引用泛型类和方法

编写可以使用的xml文档时<see cref="something">something</see>,当然可以使用.但是,如何引用具有泛型类型的类或方法?

public class FancyClass<T>
{
  public string FancyMethod<K>(T value) { return "something fancy"; }
}
Run Code Online (Sandbox Code Playgroud)

如果我要在某处写xml文档,我将如何引用这个花哨的类?我该如何参考FancyClass<string>?方法怎么样?

例如,在另一个类中,我想让用户知道我将返回一个实例FancyClass<int>.我怎么能看到cref的东西呢?

c# generics reference xml-documentation

190
推荐指数
6
解决办法
4万
查看次数

泛型类中的静态方法?

在Java中,我想有一些东西:

class Clazz<T> {
  static void doIt(T object) {
    // shake that booty
  }
}
Run Code Online (Sandbox Code Playgroud)

但我明白了

Cannot make a static reference to the non-static type T

我不了解基本用途之外的泛型,因此无法理解这一点.我无法在互联网上找到有关该主题的更多信息,这没有任何帮助.

有人可以通过类似的方式澄清这种使用是否可行?另外,为什么我的原始尝试不成功?

java generics static-methods

190
推荐指数
6
解决办法
15万
查看次数