我正在阅读斯卡拉之旅:抽象类型.什么时候使用抽象类型更好?
例如,
abstract class Buffer {
type T
val element: T
}
Run Code Online (Sandbox Code Playgroud)
而是那些泛型,例如,
abstract class Buffer[T] {
val element: T
}
Run Code Online (Sandbox Code Playgroud) 我遇到像这样的Java代码:
public interface Foo<E> {}
public interface Bar<T> {}
public interface Zar<?> {}
Run Code Online (Sandbox Code Playgroud)
上述所有这三者之间有什么区别,他们在Java中称这种类或接口声明是什么?
有一个很好的讨论泛型和他们在这个问题的幕后真正做了什么,所以我们都知道这Vector<int[]>是一个整数数组的向量,并且HashTable<String, Person>是一个表,其键是字符串和值Persons.然而,困扰我的是使用Class<>.
java类Class也应该采用模板名称,(或者我在eclipse中通过黄色下划线告诉我).我不明白我应该放在那里.Class对象的整个要点是当您没有完全拥有关于对象,反射等的信息时.为什么它让我指定Class对象将保持哪个类?我显然不知道,或者我不会使用该Class对象,我会使用具体的一个.
我有一个泛型方法,它有两个通用参数.我试图编译下面的代码,但它不起作用.它是.NET限制吗?是否可以为不同的参数设置多个约束?
public TResponse Call<TResponse, TRequest>(TRequest request)
where TRequest : MyClass, TResponse : MyOtherClass
Run Code Online (Sandbox Code Playgroud) 我在Oracle的网站上读到了Java的类型擦除.
什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?
很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?
考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.
public class A {
public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)
现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.java与A.class在类路径中,javac的是足够聪明,引发警告.所以A.class 有一些类型信息存储在其中.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: …Run Code Online (Sandbox Code Playgroud) 例如,假设您有两个类:
public class TestA {}
public class TestB extends TestA{}
Run Code Online (Sandbox Code Playgroud)
我有一个返回a的方法,List<TestA>我想将该列表中的所有对象强制转换为TestB最终得到一个List<TestB>.
我有一个使用托管dll的应用程序.其中一个dll返回一个通用字典:
Dictionary<string, int> MyDictionary;
Run Code Online (Sandbox Code Playgroud)
字典包含大小写的键.
另一方面,我得到一个潜在的密钥列表(字符串),但我不能保证这种情况.我试图使用键获取字典中的值.但是,由于案件不匹配,以下情况当然会失败:
bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue );
Run Code Online (Sandbox Code Playgroud)
我希望TryGetValue会有一个像MSDN文档中提到的忽略大小写标志,但它似乎对通用词典无效.
有没有办法让字典的值忽略关键案例?有没有比使用正确的StringComparer.OrdinalIgnoreCase参数创建字典的新副本更好的解决方法?
为什么Java中的泛型使用类而不是基本类型?
例如,这工作正常:
List<Integer> foo = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
但这是不允许的:
List<int> bar = new ArrayList<int>();
Run Code Online (Sandbox Code Playgroud) 我有一个类,我想用它来存储另一个类的"属性".这些属性只有名称和值.理想情况下,我想要的是能够添加类型属性,以便返回的"值"始终是我想要的类型.
类型应该始终是原始的.此类是一个抽象类的子类,它基本上将名称和值存储为字符串.这个想法是这个子类将为基类添加一些类型安全性(以及节省我的一些转换).
所以,我创建了一个类(大致)这个:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:
是否有一种"通用"方式从字符串转换回原语?
我似乎找不到任何通用的界面来连接整个转换(像ITryParsable这样理想!).
我想创建一个我在一个通用方法中指定的类型的实例.此类型具有许多重载的构造函数.我希望能够将参数传递给构造函数,但是
Activator.CreateInstance<T>()
Run Code Online (Sandbox Code Playgroud)
并不认为这是一个选择.
还有另一种方法吗?
generics ×10
java ×5
c# ×4
primitive ×2
.net-3.5 ×1
casting ×1
class ×1
collections ×1
dictionary ×1
list ×1
scala ×1
templates ×1
type-erasure ×1
type-safety ×1