如果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-
所以它似乎无法以任何方式通过约束来解决.从答案中有三种候选解决方案:
我倾向于认为反射是最不干净的,但我不能在其他两个之间做出决定.
我主要使用Java和泛型相对较新.我一直在阅读Java做出错误决定或者.NET有更好的实现等.
那么,泛型中C++,C#,Java之间的主要区别是什么?每个人的利弊?
我有一个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
这是从斯坦福分析器附带的一些示例中获取的一小段代码.我已经用Java开发了大约4年,但是从来没有对这种代码风格应该表明什么有非常强烈的理解.
List<? extends HasWord> wordList = toke.tokenize();
Run Code Online (Sandbox Code Playgroud)
我并不担心代码的细节.令我困惑的是,通用表达式应该用英语表达的是什么.
谁可以给我解释一下这个?
我正在深入研究仿制药,现在我需要帮助.我在下面的'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) 我有一个通用词典词典,我想基本上做一个克隆()的任何建议.
给出以下示例(使用带有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)
然后编译工作.
所以有三个问题:
assertThat方法更改为Matcher<? extends T>?是否有任何缺点?如果你这样做,还有其他案例会破裂吗?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) 我正在尝试创建一个通用扩展,使用'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) 编写可以使用的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的东西呢?
在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
我不了解基本用途之外的泛型,因此无法理解这一点.我无法在互联网上找到有关该主题的更多信息,这没有任何帮助.
有人可以通过类似的方式澄清这种使用是否可行?另外,为什么我的原始尝试不成功?