Articles of lenguaje diseño

Métodos generics de Java en clases de generics

Si crea una clase genérica en Java (la clase tiene parámetros de tipo genérico), ¿puede usar métodos generics (el método toma los parámetros de tipo genérico)? Considere el siguiente ejemplo: public class MyClass { public K doSomething(K k){ return k; } } public class MyGenericClass { public K doSomething(K k){ return k; } public List […]

¿Por qué los parámetros de const no están permitidos en C #?

Parece extraño especialmente para los desarrolladores de C ++. En C ++ solíamos marcar un parámetro como const para asegurarnos de que su estado no cambiará en el método. También existen otros motivos específicos de C ++, como pasar const ref para pasar por ref y asegurarse de que no se cambie el estado. Pero […]

¿Por qué Array no es un tipo genérico?

Array está declarado como el siguiente: public abstract class Array : ICloneable, IList, ICollection, IEnumerable { Me pregunto por qué no es así: public partial class Array : ICloneable, IList, ICollection, IEnumerable { ¿Cuál sería el problema si se declarase un tipo genérico? Si fuera un tipo genérico, ¿aún necesitaremos el genérico? Y si lo […]

¿Llamar al método varargs de Java con un solo argumento nulo?

Si tengo un método vararg Java foo(Object …arg) y llamo foo(null, null) , tengo ambos arg[0] y arg[1] como null s. Pero si llamo a foo(null) , arg sí es nulo. ¿Por qué está pasando esto? ¿Cómo debo llamar a foo para que foo.length == 1 && foo[0] == null sea true ?

¿Por qué no puedes tener múltiples interfaces en un comodín delimitado genérico?

Sé que hay todo tipo de propiedades contraintuitivas de los tipos generics de Java. Aquí hay uno en particular que no entiendo, y que espero que alguien pueda explicarme. Al especificar un parámetro de tipo para una clase o interfaz, puede vincularlo para que implemente múltiples interfaces con public class Foo . Sin embargo, si […]

¿Por qué debemos definir ambos == y! = En C #?

El comstackdor de C # requiere que siempre que un tipo personalizado defina operador == , también debe definir != (Ver aquí ). ¿Por qué? Tengo curiosidad por saber por qué los diseñadores pensaron que era necesario y por qué el comstackdor no puede realizar una implementación razonable para ninguno de los operadores cuando solo […]

Sintaxis para referencias universales

Esta es una referencia de valor real: void foo(int&& a); No se une a lvalues: int i = 42; foo(i); // error Esta es una referencia universal: template void bar(T&& b); Se une a rvalues ​​y también se une a lvalues: bar(i); // okay Esta es una referencia de valor real: template struct X { […]

¿Por qué C ++ necesita el operador de resolución de scope?

(Sé lo que hace el operador de resolución de scope, y cómo y cuándo usarlo). ¿Por qué C ++ tiene el operador :: , en lugar de usar el . operador para este fin? Java no tiene un operador separado y funciona bien. ¿Hay alguna diferencia entre C ++ y Java que signifique que C […]

¿Por qué los idiomas no generan errores en el desbordamiento de enteros de forma predeterminada?

En varios lenguajes de progtwigción modernos (incluidos C ++, Java y C #), el lenguaje permite que el desbordamiento de enteros ocurra en el tiempo de ejecución sin generar ningún tipo de condición de error. Por ejemplo, considere este método (artificial) de C #, que no tiene en cuenta la posibilidad de desbordamiento / subdesbordamiento. […]

¿Por qué la Variable de iteración en una instrucción de C # foreach es de solo lectura?

Según lo entiendo, la variable de iteración foreach de C # es inmutable. Lo que significa que no puedo modificar el iterador de esta manera: foreach (Position Location in Map) { //We want to fudge the position to hide the exact coordinates Location = Location + Random(); //Compiler Error Plot(Location); } No puedo modificar la […]